我有一个函数,它将递归地执行里面的另一个函数。我想为该函数的所有执行共享变量。
类似的东西:
def testglobal():
x = 0
def incx():
global x
x += 2
incx()
return x
testglobal() # should return 2
然而,我收到错误NameError: name 'x' is not defined
有一种巧妙的解决方案可以制作列表,并使用该列表的第一个值作为x
。但这太难看了。
那么,如何将x
与incx
功能共享呢?还是应该使用完全不同的方法?
除非您仍在使用Python 2.x:,否则这将起作用
def testglobal():
x = 0
def incx():
nonlocal x
x += 2
incx()
return x
testglobal() # should return 2
不过,一个更干净的解决方案可能是定义一个类来存储方法调用之间的状态。
使用nonlocal
语句,因此incx
将使用testglobal
:中的x
变量
def testglobal():
x = 0
def incx():
nonlocal x
x += 2
incx()
return x
testglobal()
您希望使用nonlocal
语句来访问x
,它不是全局的,而是testglobal
的本地语句。
def testglobal():
x = 0
def incx():
nonlocal x
x += 2
incx()
return x
assert 2 == testglobal()
在Python 2中,最接近于这样做的方法是用可变值替换x
,类似于您在问题中提到的参数破解。
def testglobal():
x = [0]
def incx():
x[0] += 2
incx()
return x[0]
assert 2 == testglobal()
下面是一个使用函数属性而不是列表的示例,您可能会发现这是一种更具吸引力的替代方法。
def testglobal():
def incx():
incx.x += 2
incx.x = 0
incx()
return inc.x
assert 2 == testglobal()