【发布时间】:2011-01-01 20:05:58
【问题描述】:
闭包是一个非常有用的语言特性。它们让我们可以做一些聪明的事情,否则会需要大量代码,并且通常使我们能够编写更优雅、更清晰的代码。在 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
【问题讨论】:
-
好吧,在这种情况下,
itertools.count(1).next。根据我的经验,要找到真正的 Python 使用闭包“不如 Perl/JS/Scheme 干净或优雅”的实际案例并不容易。 -
你真正要找的是所谓的“发电机”
-
我选择这个代码示例是因为它很简单,而不是因为它是我真正想在生产中使用的。我会尝试记住一个好的生产示例并对其进行编辑。显然,我选择的示例代码让人们望而却步。
-
@fuzzy-lollipop 这显然是错误的。我知道生成器是什么,并且我经常使用它们。发电机太棒了。然而,生成器不是读/写闭包。
-
协程看起来可能就是这样。
标签: python language-design closures readonly