我有一个函数会递归执行另一个函数,我希望为该函数的所有执行共享变量。
类似的东西:
def testglobal():
x = 0
def incx():
global x
x += 2
incx()
return x
testglobal() # should return 2
但是,我收到错误NameError: name 'x' is not defined
有一个hacky解决方案来制作列表并将该列表的第一个值用作x
。但这太丑了。
那么如何与x
功能共享incx
?或者我应该使用完全不同的方法吗?
答案 0 :(得分:3)
除非您仍在使用Python 2.x,否则这将有效:
def testglobal():
x = 0
def incx():
nonlocal x
x += 2
incx()
return x
testglobal() # should return 2
可能更清晰的解决方案是定义一个类来在方法调用之间存储状态。
答案 1 :(得分:2)
使用nonlocal
语句,因此incx
将使用x
中的testglobal
变量:
def testglobal():
x = 0
def incx():
nonlocal x
x += 2
incx()
return x
testglobal()
答案 2 :(得分:1)
您希望使用nonlocal
语句访问x
,testglobal
不是全局的,而是def testglobal():
x = 0
def incx():
nonlocal x
x += 2
incx()
return x
assert 2 == testglobal()
的本地语。
x
你在Python 2中最接近的做法是用可变值替换def testglobal():
x = [0]
def incx():
x[0] += 2
incx()
return x[0]
assert 2 == testglobal()
,类似于你在问题中提到的hack参数。
def testglobal():
def incx():
incx.x += 2
incx.x = 0
incx()
return inc.x
assert 2 == testglobal()
这是一个使用函数属性而不是列表的示例,您可能会发现它更具吸引力。
from jsondiff import diff
diff(json1, json2)