我对 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 的引用。
这是正确的解释吗?
默认参数是捕获值的另一种方法:
lst.append(lambda i=i: i)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)