1

誰かがここで何が起こっているのか説明できますか

x = 10
def foo():
    print "x in foo = ",x
    if x: x = 8    -------------> mysterious line

foo()
print "x in main = ",x

上記のコードで、不思議な行をコメントアウトすると(x:x = 8の場合)

出力を取得します

x in foo =  10
x in main =  10

そうしないと、エラーが発生します

"UnboundLocalError:割り当て前に参照されたローカル変数'x'"

なぜそうなのか?

global xグローバル変数をローカルで変更する必要がある場合にのみ役立つことがわかっています。

4

5 に答える 5

5

関数内の任意の場所に割り当てを行うと、割り当てx前にその値への参照があったとしても、ローカル変数になります。

于 2012-09-17T14:41:23.190 に答える
3

関数では、宣言xなしでに割り当てます。ローカル変数もそうです。ただし、関数が割り当てられる前に関数を読み取ろうとするため、その時点でバインドされていないローカルがあります。globalxx

于 2012-09-17T14:41:54.633 に答える
2

最初は奇妙に思えるかもしれませんが、ローカル名が静的に検出されるということです。名前が関数内のどこかxに割り当てられている場合、Python はそれが関数内のどこでもローカル名であると想定します。x

xつまり、関数の行の順序は誤解を招きます。関数のどこかに が割り当てられている限り、最初の行xはローカル変数への参照になります (このコード ポイントではまだバインドされていません)。

于 2012-09-17T14:48:42.303 に答える
1

Wooble が既に言ったように、使用する前にグローバル変数の変更を宣言する必要があります。

def foo():  
   global x  
   print "x in foo = ",x  
   if x: x = 8 
于 2012-09-17T14:51:57.070 に答える
0

x = 8関数内のどこでもglobal xローカル変数にします。print xローカル変数が初期化されていないため失敗します

于 2012-09-17T14:54:11.700 に答える