Python 从嵌套函数中的封闭范围访问变量

Python 从嵌套函数中的封闭范围访问变量,python,scope,closures,Python,Scope,Closures,我在另一个函数foo中嵌套了一个函数定义栏。现在我尝试从嵌套函数栏访问位于外部函数foo中的变量。但是,由于作用域规则,这不起作用。请参见下面的错误回溯 我正在寻找类似于global关键字的东西,但是它只允许我访问全局变量,而这是某种半全局变量 下面是示例代码: def foo(): i = 0 def bar(): # how can I get access to the variable from enclosing scope? i +=

我在另一个函数foo中嵌套了一个函数定义栏。现在我尝试从嵌套函数栏访问位于外部函数foo中的变量。但是,由于作用域规则,这不起作用。请参见下面的错误回溯

我正在寻找类似于global关键字的东西,但是它只允许我访问全局变量,而这是某种半全局变量

下面是示例代码:

def foo():
    i = 0
    def bar():
        # how can I get access to the variable from enclosing scope?
        i += 1
    bar()

foo()
输出为:

$ python test.py
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    foo()
  File "test.py", line 5, in foo
    bar()
  File "test.py", line 4, in bar
    i += 1
UnboundLocalError: local variable 'i' referenced before assignment
您需要非局部语句而不是全局语句

我显然不是全球性的,但它也不是foo的本地产品。它是本地的。因此,为了访问它,将其声明为非本地

不幸的是,只有非本地的ist python3。 您可以通过闭包来模拟它,但这会变得非常糟糕。

您需要非局部语句而不是全局语句

我显然不是全球性的,但它也不是foo的本地产品。它是本地的。因此,为了访问它,将其声明为非本地

不幸的是,只有非本地的ist python3。
您可以通过闭包来模拟它,但这会变得非常糟糕。

以下是您的工作:

class Test(object):
    def __init__(self):
        i = [0]
        def foo():
            i[0] += 1
        foo()
        print i[0]

t = Test()

这将是非局部关键字的用例,而不是全局关键字,但它仅在Python 3中可用。

以下是您的解决方法:

class Test(object):
    def __init__(self):
        i = [0]
        def foo():
            i[0] += 1
        foo()
        print i[0]

t = Test()

这将是非局部关键字的一个用例,而不是全局关键字,但它仅在Python 3中可用。

您试图实现什么?请解释这样做的原因。这将有助于我们提供更好的解决方案。您想实现什么目标?请解释这样做的原因。这将帮助我们提供更好的解决方案显然非本地仅适用于Python3.x,但这是一个很好的搜索关键字。显然非本地仅适用于Python3.x,但这是一个很好的搜索关键字。Python2.x变通方法+1。令人惊讶的是,容器类型不受此影响。这里为您节省的是,范围规则确实允许读取访问。从技术上讲,您不向i写信,而是向i[0]写信……很有趣,可以很好地解释这一点。+1用于Python2.x解决方案。令人惊讶的是,容器类型不受此影响。这里为您节省的是,范围规则确实允许读取访问。从技术上讲,你不写信给我,你写信给我[0]……很有趣,发现这解释得很好。