我刚看到了Eric Lippert的《不要在循环变量上使用闭包》,并进行了实验后发现同样的问题也存在于Python中,而且更难以解决。
>>> l = []
>>> for r in range(10):
... def foo():
... return r
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
此外,标准的C#解决方法并不起作用(我认为是因为Python中引用的本质不同)。
>>> l = []
>>> for r in range(10):
... r2 = r
... def foo():
... return r2
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
我知道在Python中这不是太大的问题,因为它通常强调非闭包对象结构,但我想知道是否有明显的Pythonic方法来处理这个问题,或者我们是否必须采用JS方式的嵌套函数调用来创建实际上的新变量?
>>> l = []
>>> for r in range(10):
... l.append((lambda x: lambda: x)(r))
...
>>> for f in l:
... f()
...
0
1
2
# etc