18
我刚刚通过SO跑遍了Eric Lippert的Closing over the loop variable considered harmful,并且在试验后发现,在Python中存在相同的问题(甚至更难以避开)。是否有Pythonic方法来关闭循环变量?
>>> 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
哦,我喜欢这个默认的参数技巧。该函数工厂在语义上类似于我的末尾的双lambda事物。不过,Lambda工厂是可读性的祸根。 – quodlibetor