Python仅为函数内部的函数共享全局变量

时间:2016-09-23 14:24:44

标签: python scope global-variables python-3.5

我有一个函数会递归执行另一个函数,我希望为该函数的所有执行共享变量。

类似的东西:

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?或者我应该使用完全不同的方法吗?

3 个答案:

答案 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语句访问xtestglobal不是全局的,而是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)