一尘不染

读/写Python闭包

python

闭包是一种非常有用的语言功能。他们让我们做一些本来需要很多代码的聪明的事情,并且常常使我们能够编写更优雅,更清晰的代码。在Python
2.x中,闭包变量名不能反弹。也就是说,在另一个词法范围内定义的函数无法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

阅读 194

收藏
2021-01-20

共1个答案

一尘不染

扩展伊格纳西奥的答案:

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更惯用。

2021-01-20