闭包是一种非常有用的语言功能。他们让我们做一些本来需要很多代码的聪明的事情,并且常常使我们能够编写更优雅,更清晰的代码。在Python 2.x中,闭包变量名不能反弹。也就是说,在另一个词法范围内定义的函数无法some_var = 'changed!'对其局部范围外的变量执行类似的操作。有人可以解释为什么吗?在某些情况下,我想创建一个在外部范围内重新绑定变量的闭包,但这是不可能的。我意识到,几乎在所有情况下(如果不是全部),这种行为都可以通过类来实现,但它通常不那么简洁。为什么我不能关闭它呢?
some_var = 'changed!'
这是重新绑定闭包的示例:
def counter(): count = 0 def c(): count += 1 return count return c
调用时,这是当前行为:
>>> c() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in c UnboundLocalError: local variable 'count' referenced before assignment
我想要它做的是这样的:
>>> c() 1 >>> c() 2 >>> c() 3
扩展伊格纳西奥的答案:
def counter(): count = 0 def c(): nonlocal count count += 1 return count return c x = counter() print([x(),x(),x()])
在Python 3中给出[1,2,3];counter()给独立计数器的调用。其他解决方案-尤其是使用itertools/yield更惯用。
counter()
itertools
yield