New submission from Martijn Pieters <[email protected]>:
In Python 2.6, a list comprehension was implemented in the current scope using
a temporary _[1] variable to hold the list object:
>>> import dis
>>> dis.dis(compile('[x for x in y]', '?', 'exec'))
1 0 BUILD_LIST 0
3 DUP_TOP
4 STORE_NAME 0 (_[1])
7 LOAD_NAME 1 (y)
10 GET_ITER
>> 11 FOR_ITER 13 (to 27)
14 STORE_NAME 2 (x)
17 LOAD_NAME 0 (_[1])
20 LOAD_NAME 2 (x)
23 LIST_APPEND
24 JUMP_ABSOLUTE 11
>> 27 DELETE_NAME 0 (_[1])
30 POP_TOP
31 LOAD_CONST 0 (None)
34 RETURN_VALUE
Nick Cochlan moved comprehensions into a separate scope in #1660500, and
removed the need for a temporary variable in the process (the list / dict / set
lives only on the stack).
However, the symbol table generates the _[1] name:
>>> import symtable
>>> symtable.symtable('[x for x in y]', '?',
>>> 'exec').get_children()[0].get_symbols()
[<symbol '.0'>, <symbol '_[1]'>, <symbol 'x'>]
Can this be dropped? I think all temporary variable handling can be ripped out.
----------
messages: 312081
nosy: mjpieters
priority: normal
severity: normal
status: open
title: Symbol table for comprehensions (list, dict, set) still includes
temporary _[1] variable
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue32836>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com