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

How to avoid leaking the loop index into namespace for python 2.x?

for i in mylist:
    process(i)

[process(j) for j in mylist]

在执行结束时,ij 保留在名称空间中,最后的值为 mylist

除了创建一个专门的函数来隐藏 i 以防泄漏;隐藏循环索引的其他方法是什么?

除了明确删除 ij:

之外,您无能为力
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

旁注:如果列表为空,则变量保持未定义状态:

for i in []:
    pass
print i  # NameError: name 'i' is not defined

还有一件事:在 python 2.x 中,来自列表推导的变量(尽管不是生成器表达式)也被泄露了;在 python 3.x 这是 NameError.

[i for i in range(3)]
print i  #  2

正如所指出的,要阻止 i 在 for 循环中泄漏,您无能为力,但如果您只想在可迭代对象(如列表)上应用一个函数,您可以使用 map(yourFunction, yourList) 而不是 for 循环。那就不用担心i或j了。