“lambda中的变量后期限制”:
>>> a = [lambda: c for c in range(4)]
>>> [f() for f in [lambda: c for c in range(4)]]
[3,3,3,3]
>>> b = [10]
>>> a = b
>>> f = lambda: b
>>> f()
[10]
>>> a[0] = 20
>>> f()
[20]
>>> del b
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
NameError: name 'b' is not defined
>>> a
[20]
由于我们删除了b
,因此无法通过该名称引用该列表。但是,请考虑
>>> def F():
... x = 3
... return lambda: x
...
>>> F()()
3
在这种情况下,x
也无法在当前作用域或任何现有作用域中引用,我们无法通过lambda本身以任何其他方式访问x
但它很高兴地引用了x
的值3.在某个阶段,在F
内部和F()()
调用lambda之间的时间x
的值附在lambda上。如果我们创建一个新的x
,那么lambda
>>> x = 20
>>> F()()
3
我的问题是:lambda在通过范围边界时是否“知道”,以便它可以捕获它需要的任何变量?
来自C ++背景,我习惯于明确地告诉我的lambdas他们通过值捕获什么,以及他们通过引用捕获什么。这种约束 - 有时是早 - 有时 - 迟到,现在已经让我绊倒了几次。