【发布时间】:2015-01-18 21:21:23
【问题描述】:
Eli Bendersky (http://eli.thegreenplace.net/2015/the-scope-of-index-variables-in-pythons-for-loops/) 给出的这个例子让我有点惊讶
>>> def foo():
... lst = []
... for i in range(4):
... lst.append(lambda: i)
... print([f() for f in lst])
...
>>> foo()
[3, 3, 3, 3]
但是当我想到它时,它是有道理的 - lambda 正在捕获对 i 的引用而不是 i 的值。
因此,解决此问题的方法如下:
>>> def foo():
... lst = []
... for i in range(4):
... lst.append((lambda a: lambda: a)(i))
... print([f() for f in lst])
...
>>> foo()
[0, 1, 2, 3]
这似乎是因为当 i 被提供给外部 lambda 时,外部 lambda 会创建一个范围并取消对 i 的引用,将 a 设置为 i。然后,返回的内部 lambda 包含对 a 的引用。
这是正确的解释吗?
【问题讨论】:
标签: python python-2.7 lambda