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



我有一个函数,它将递归地执行里面的另一个函数。我想为该函数的所有执行共享变量。

类似的东西:

def testglobal():
  x = 0
  def incx():
    global x
    x += 2
  incx()
  return x
testglobal() # should return 2

然而,我收到错误NameError: name 'x' is not defined

有一种巧妙的解决方案可以制作列表,并使用该列表的第一个值作为x。但这太难看了。

那么,如何将xincx功能共享呢?还是应该使用完全不同的方法?

除非您仍在使用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() 

相关内容

  • 没有找到相关文章

最新更新