Benjamin Peterson <[EMAIL PROTECTED]> added the comment: This is because list comprehensions are implemented as functions in 3.0 so their scope is not leaked out to the rest of the function.
Here is the bytecode for 2.6: >>> dis.dis(f) 2 0 BUILD_LIST 0 3 DUP_TOP 4 STORE_FAST 0 (_[1]) 7 LOAD_CONST 5 ((1, 2, 3)) 10 GET_ITER >> 11 FOR_ITER 14 (to 28) 14 STORE_FAST 1 (x) 17 LOAD_FAST 0 (_[1]) 20 LOAD_FAST 1 (x) 23 YIELD_VALUE 24 LIST_APPEND 25 JUMP_ABSOLUTE 11 >> 28 DELETE_FAST 0 (_[1]) 31 STORE_FAST 1 (x) 3 34 LOAD_CONST 4 (5) 37 YIELD_VALUE 38 POP_TOP 4 39 LOAD_FAST 1 (x) 42 YIELD_VALUE 43 POP_TOP 44 LOAD_CONST 0 (None) 47 RETURN_VALUE and here it is for 3.0: >>> dis.dis(f) 2 0 LOAD_CONST 1 (<code object <listcomp> at 0x740770, file "<stdin>", line 2>) 3 MAKE_FUNCTION 0 6 LOAD_CONST 6 ((1, 2, 3)) 9 GET_ITER 10 CALL_FUNCTION 1 13 STORE_FAST 0 (x) 3 16 LOAD_CONST 5 (5) 19 YIELD_VALUE 20 POP_TOP 4 21 LOAD_FAST 0 (x) 24 YIELD_VALUE 25 POP_TOP 26 LOAD_CONST 0 (None) 29 RETURN_VALUE ---------- nosy: +benjamin.peterson type: -> behavior _______________________________________ Python tracker <[EMAIL PROTECTED]> <http://bugs.python.org/issue3267> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com