我正在尝试在Python2.6中实现一个闭包,并且我需要访问一个非局部变量,但是这个关键字似乎在Python2.x中不可用。在这些版本的python中,应该如何访问闭包中的非局部变量?
发布于 2013-04-16 16:51:24
下面的解决方案受到answer by Elias Zamaria的启发,但与答案相反的是,它确实正确地处理了外部函数的多次调用。对于当前的outer
调用,“变量”inner.y
是本地的。只是它不是一个变量,因为这是被禁止的,而是一个对象属性(对象是函数inner
本身)。这非常难看(请注意,该属性只能在定义inner
函数之后创建),但似乎很有效。
def outer():
def inner():
inner.y += 1
return inner.y
inner.y = 0
return inner
f = outer()
g = outer()
print(f(), f(), g(), f(), g()) #prints (1, 2, 1, 3, 2)
发布于 2010-07-07 06:51:19
我认为这里的关键是你所说的“访问”是什么意思。在闭包作用域之外读取变量应该没有问题,例如,
x = 3
def outer():
def inner():
print x
inner()
outer()
应该可以正常工作(打印3)。然而,覆盖x的值不起作用,例如,
x = 3
def outer():
def inner():
x = 5
inner()
outer()
print x
将仍然打印3。根据我对PEP-3104的理解,这就是非本地关键字要涵盖的内容。正如在PEP中提到的,您可以使用一个类来完成相同的事情(有点混乱):
class Namespace(object): pass
ns = Namespace()
ns.x = 3
def outer():
def inner():
ns.x = 5
inner()
outer()
print ns.x
发布于 2012-12-10 11:25:14
在Python2中还有另一种实现非局部变量的方法,以防这里的任何答案因任何原因而不可取:
def outer():
outer.y = 0
def inner():
outer.y += 1
return outer.y
return inner
f = outer()
print(f(), f(), f()) #prints 1 2 3
在变量的赋值语句中使用函数名是多余的,但在我看来,这比将变量放在字典中更简单、更干净。从一个调用到另一个调用时会记住该值,就像在Chris B.的回答中一样。
https://stackoverflow.com/questions/3190706
复制相似问题