can*_*dry 1 python language-design python-2.x python-2.7
for i in mylist:
process(i)
[process(j) for j in mylist]
Run Code Online (Sandbox Code Playgroud)
在执行结束,i
并j
留在命名空间的最后一个值mylist
.
除了创建一个隐藏i
泄漏的专门功能; 隐藏循环索引的其他方法是什么?
除了明确删除i
和之外,你没有其他的事情可做j
:
for i in mylist:
process(i)
[process(j) for j in mylist]
print j, i # -> 8 8
del i, j
print j, i # NameError: name 'j' is not defined
Run Code Online (Sandbox Code Playgroud)
旁注:如果列表为空,则变量保持未定义:
for i in []:
pass
print i # NameError: name 'i' is not defined
Run Code Online (Sandbox Code Playgroud)
还有一件事:在python 2.x中,来自list-comprehensions的变量(虽然不是生成器表达式)也被泄露了; 在python 3.x这是一个NameError
.
[i for i in range(3)]
print i # 2
Run Code Online (Sandbox Code Playgroud)