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

Reply via email to