何时变量绑定在闭包中?

时间:2018-06-14 04:54:23

标签: python-3.5

“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他们通过值捕获什么,以及他们通过引用捕获什么。这种约束 - 有时是早 - 有时 - 迟到,现在已经让我绊倒了几次。

0 个答案:

没有答案