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

时间:2012-04-17 15:02:06

标签: python scope closures

我在另一个函数bar()中嵌套了一个函数定义foo()。现在我试图从嵌套函数foo()访问位于外部函数bar()中的变量。但是,由于范围规则(参见下面的错误追溯),这不起作用。

我正在寻找类似于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

2 个答案:

答案 0 :(得分:6)

您需要使用nonlocal语句而不是global

i显然不是全球性的,但它也不是foo本地的。它位于__init__的本地。因此,为了访问它,请声明它nonlocal

不幸的是,nonlocal只是python3。 你可以通过闭包来模拟它,但这会非常难看。

答案 1 :(得分:3)

以下是您的工作:

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

t = Test()

这将是nonlocal关键字的用例,而不是global,但仅适用于Python 3。