如何避免将循环索引泄露到python 2.x的命名空间?

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)

在执行结束,ij留在命名空间的最后一个值mylist.

除了创建一个隐藏i泄漏的专门功能; 隐藏循环索引的其他方法是什么?

hir*_*ist 5

除了明确删除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)