带有副作用的 Python 闭包

标签 python closures side-effects

我想知道 Python 中的闭包是否可以操作其命名空间中的变量。您可能会称此为副作用,因为状态正在闭包本身之外更改。我想做这样的事情

def closureMaker():
  x = 0
  def closure():
    x+=1
    print x
  return closure

a = closureMaker()
a()
1
a()
2

显然我希望做的更复杂,但这个例子说明了我在说什么。

最佳答案

在 Python 2.x 中你不能完全做到这一点,但你可以使用一个技巧来获得相同的效果:使用可变对象,例如列表。

def closureMaker():
    x = [0]
    def closure():
        x[0] += 1
        print x[0]
    return closure

您还可以使 x 成为具有命名属性或字典的对象。这比列表更具可读性,尤其是当您要修改多个此类变量时。

在 Python 3.x 中,您只需将 nonlocal x 添加到您的内部函数中。这会导致对 x 的赋值转到外部范围。

关于带有副作用的 Python 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6566227/

相关文章:

c - 什么是具有副作用的表达式?为什么不应将它们传递给宏?

python - 使用 Google App Engine 时出现导入错误

python - 我怎么能告诉 Nbconvert : "Please, this time use pdfLaTeX in place of XeLaTeX"

javascript - 在javascript中将函数分配给变量时识别变量

java - 是否有可能在 Java 8 中创建一个无限增长的惰性集合,由递归定义?

python - 循环内的副作用会影响它的生成器吗?

c++ - 对对象指针的副作用

python - 有效地将列表转换为数据框

python - 如何使用 PyUSB 写入控制端点

c# - 在 C# 中使用闭包创建分层数据?