1

I have nested a function definition bar() inside another function foo(). Now I am trying to access a variable located in the outer function foo() from the nested function bar(). This however doesn't work because of the scoping rules (see error traceback below).

I am looking for something similar to the global keyword, which however only enables me to access global variables, whereas this is some kind of semi-global variable.

Here's example code:

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

foo()

The output is:

$ 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
4

2 に答える 2

7

nonlocalの代わりにステートメントが必要ですglobal

iは明らかにグローバルではありませんが、ローカルでもありませんfoo。にローカル__init__です。したがって、それにアクセスするには、それを宣言しnonlocalます。

残念ながら、nonlocalこれは python3 のみです。クロージャーを介してシミュレートできますが、それはかなり醜いものになります。

于 2012-04-17T15:06:06.650 に答える
3

回避策は次のとおりです。

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

t = Test()

これはnonlocal、代わりにキーワードの使用例になりglobalますが、Python 3 以降でのみ使用可能です。

于 2012-04-17T15:07:47.353 に答える