1
def counter(x):

    def _cnt():
        #nonlocal x
        x = x+1
        print(x)
        return x

    return _cnt
a = counter(0)
print(a())

上記のコードでは、次のエラーが発生します

UnboundLocalError: 代入前にローカル変数 'x' が参照されました

_cnt の名前空間に値 'x+1' を持つ新しいオブジェクトを作成して x にバインドできないのはなぜですか。両方の関数名前空間に参照 x があります

4

2 に答える 2

3

特定のスコープ内の名前に割り当てるとすぐに、同じスコープ内の同じ名前へのすべての参照がローカルになります。したがってx + 1、評価できません ( local を参照しようとするためx)。

したがって、これは機能します:

def f():
    x = 42
    def g():
        print(x)
    g()
f()

しかし、これはしません:

def f():
    x = 42
    def g():
        print(x)
        x = 42
    g()
f()

最初のprintバイトコードは次のとおりです。

0 LOAD_GLOBAL              0 (print) 
3 LOAD_DEREF               0 (x) 
6 CALL_FUNCTION            1 
9 POP_TOP  

2番目printにはこれがあります:

0 LOAD_GLOBAL              0 (print) 
3 LOAD_FAST                0 (x) 
6 CALL_FUNCTION            1 
9 POP_TOP 
于 2013-09-28T05:29:20.770 に答える
1

機能範囲counter_cntは同じではありません。ネストされていても問題ありません。

したがって、xinは in にcounter存在しません_cnt。おそらくそれを引数として渡します(またはnonlocal、理解したように を使用します)

于 2013-09-28T05:29:54.940 に答える