What is a function parameter =[] for?
Steven D'Aprano
steve at pearwood.info
Tue Nov 24 12:54:03 EST 2015
On Wed, 25 Nov 2015 02:17 am, Chris Angelico wrote:
> On Wed, Nov 25, 2015 at 2:03 AM, Antoon Pardon
> <antoon.pardon at rece.vub.ac.be> wrote:
>> So are you saying
>>
>> () isn't a literal
>>
>> because
>>
>> (x * x for x in range(int(input("How far? ")))) isn't a literal?
>
> I'm pretty sure tuple/list/dict display predates comprehensions, and
> was already not a literal syntax. Steven, you know the history better
> than I do - confirm or deny?
I must admit that I'm often guilty of referring to [a, b, c] as a list
literal, but, no, () and related forms aren't literals[1], and yes,
tuple/list/dict displays predates list comprehensions by a long time.
Here's Python 1.5:
Python 1.5.2 (#1, Aug 27 2012, 09:09:18) [GCC 4.1.2 20080704 (Red Hat
4.1.2-52)] on linux2
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import dis
>>> code = compile("(1, 2, 3)", "", "eval")
>>> dis.dis(code)
0 SET_LINENO 0
3 LOAD_CONST 0 (1)
6 LOAD_CONST 1 (2)
9 LOAD_CONST 2 (3)
12 BUILD_TUPLE 3
15 RETURN_VALUE
So you can see the tuple actually gets assembled at runtime. Even if the
tuple is empty, the same process occurs:
>>> code = compile("()", "", "eval")
>>> dis.dis(code)
0 SET_LINENO 0
3 BUILD_TUPLE 0
6 RETURN_VALUE
In contrast, using an actual literal (even a big one) loads the literal as a
pre-existing constant:
>>> code = compile("42000009999999999L", "", "eval")
>>> dis.dis(code)
0 SET_LINENO 0
3 LOAD_CONST 0 (42000009999999999L)
6 RETURN_VALUE
[1] Although with recent versions of Python, the peephole optimizer is
clever enough to treat tuples consisting of nothing but literals as if it
were itself a literal. E.g. in Python 3.3:
py> import dis
py> code = compile("(1, 2, 3)", "", "eval")
py> dis.dis(code)
1 0 LOAD_CONST 3 ((1, 2, 3))
3 RETURN_VALUE
But that is a recent optimization, and it relies on the facts that tuples
are immutable, and that the items within the tuple are themselves immutable
literals:
py> code = compile("(1, 2, [])", "", "eval")
py> dis.dis(code)
1 0 LOAD_CONST 0 (1)
3 LOAD_CONST 1 (2)
6 BUILD_LIST 0
9 BUILD_TUPLE 3
12 RETURN_VALUE
--
Steven
More information about the Python-list
mailing list