17

与えられた:

def f():
    x = 0
    def g():
        h()
    def h():
        x += 1
        print(x)
    g()

>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in f
  File "<stdin>", line 4, in g
  File "<stdin>", line 6, in h
UnboundLocalError: local variable 'x' referenced before assignment
>>>

変数をh表示するにはどうすればよいですか?x

ありがとう。

編集

先に述べておくべきだったのですが、私は Python 2.7.3 を使用しています。

4

5 に答える 5

15

関数属性xを作成できます:

def f():
    f.x = 0
    def g():
        h()
    def h():
        f.x += 1
        print(f.x)
    g()

また、Python 3 以降では、nonlocalキーワードを使用できます。

于 2012-04-22T18:59:37.100 に答える
7

Python 3 を使用している場合は、nonlocalキーワードを使用します。nonlocal x関数の先頭に置きますh。Python 2.x を使用している場合、回避策はx1 つの要素でリストを作成することです。そのため、それを変更できます。

def f():
    x = [0]
    def g():
        h()
    def h():
        x[0] += 1
        print x[0]
    g()

f()
于 2012-04-22T18:58:38.130 に答える
6

Python 3 では、次のように使用しますnonlocal

def f():
    x = 0
    def g():
        h()
    def h():
        nonlocal x
        x += 1
        print(x)
    g()
f()
于 2012-04-22T19:01:05.940 に答える
0

x回避策として関数の引数として入れることはできませんか

def f():
    x = 0
    def g():
        h(x)
    def h(x):
        x += 1
        print(x)
    g()

f() 
于 2013-01-23T05:32:41.080 に答える
0

最も簡単なのは、辞書または空のクラスを使用することです。次に例を示します。

class Empty:
    x = 0

def f():
    closure1 = dict(x=0)
    closure2 = Empty()
    def g(): h(x)
    def h(x):
        closure1["x"] += 1
        closure2.x += 1
    g()
    print closure1["x"], closure2.x

多くの優れたソリューションが既に提供されていますが、それらにはコーナー ケースがあります。

  • Ashwini によると、非ローカルは Python 3.x のみです。
  • 関数属性は、ovgolovin ごとに失敗し、f再定義され、後で参照によって呼び出されます。
于 2013-02-06T14:24:34.640 に答える