On Wed, 02 Oct 2013 18:17:06 -0400, Terry Reedy wrote: > CPython core developers have be very conservative about what > tranformations they put into the compiler. (1,2,3) can always be > compiled as a constant, and so it is. [1,2,3] might or might not be a > constant, depending on the context, and no attempt is made to analyze > that.
The first sentence of this is correct. The next two don't quite make sense to me, since I don't understand what you mean by "constant" in this context. I *think* you might be referring to the LOAD_CONST byte-code, which in Python 3.3 understands tuples like (1, 2, 3), but not lists. So a literal (1, 2, 3) gets created at compile-time with a single LOAD_CONST call: py> from dis import dis py> dis(compile("x = (1, 2, 3)", '', 'exec')) 1 0 LOAD_CONST 4 ((1, 2, 3)) 3 STORE_NAME 0 (x) 6 LOAD_CONST 3 (None) 9 RETURN_VALUE while a literal [1, 2, 3] does not: py> dis(compile("x = [1, 2, 3]", '', 'exec')) 1 0 LOAD_CONST 0 (1) 3 LOAD_CONST 1 (2) 6 LOAD_CONST 2 (3) 9 BUILD_LIST 3 12 STORE_NAME 0 (x) 15 LOAD_CONST 3 (None) 18 RETURN_VALUE But I don't think this is a necessary language limitation. Both (1, 2, 3) and [1, 2, 3] are known at compile time: the first cannot be anything other than a tuple of three ints, and the second a list of three ints. It seems to me that an implementation might provide a single byte-code to build list literals, perhaps even LOAD_CONST itself. The byte-codes used by the Python VM are not part of the language definition, and are subject to change without warning. And in fact, if we go all the way back to Python 1.5, even tuple literals weren't handled by a single byte-code, they were assembled at runtime like lists still are: [steve@ando ~]$ python1.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 >>> from dis import dis >>> dis(compile("x = (1, 2, 3)", '', 'exec')) 0 SET_LINENO 0 3 SET_LINENO 1 6 LOAD_CONST 0 (1) 9 LOAD_CONST 1 (2) 12 LOAD_CONST 2 (3) 15 BUILD_TUPLE 3 18 STORE_NAME 0 (x) 21 LOAD_CONST 3 (None) 24 RETURN_VALUE -- Steven -- https://mail.python.org/mailman/listinfo/python-list