data
是列表理解的 来源 ;它是传递给创建的嵌套作用域的一个参数。
列表理解中的所有内容都在单独的范围内运行(基本上是作为一个函数),除了用于最左侧for
循环的可迭代对象。您可以在字节码中看到这一点:
>>> def foo():
... return [i for i in data]
...
>>> dis.dis(foo)
2 0 LOAD_CONST 1 (<code object <listcomp> at 0x105390390, file "<stdin>", line 2>)
3 LOAD_CONST 2 ('foo.<locals>.<listcomp>')
6 MAKE_FUNCTION 0
9 LOAD_GLOBAL 0 (data)
12 GET_ITER
13 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
16 RETURN_VALUE
的<listcomp>
代码对象被称为像的功能,以及iter(data)
作为参数(在被传递CALL_FUNCTION
与1个位置参数,执行的GET_ITER
结果)。
>>> dis.dis(foo.__code__.co_consts[1])
2 0 BUILD_LIST 0
3 LOAD_FAST 0 (.0)
>> 6 FOR_ITER 12 (to 21)
9 STORE_FAST 1 (i)
12 LOAD_FAST 1 (i)
15 LIST_APPEND 2
18 JUMP_ABSOLUTE 6
>> 21 RETURN_VALUE