def say_boo_twice():
global boo
boo = 'Boo!'
print boo, boo
boo = 'boo boo'
say_boo_twice()
出力は
ブー!ブー!
思った通りではありません。 boo
をグローバルとして宣言したので、出力が次のようにならないのはなぜですか。
ブーブーブーブー
関数内でboo
を変更しましたが、なぜ変更しないのですか?また、グローバル変数は悪いです。
直前に再割り当てするためです。コメントアウトboo = 'Boo!'
そしてあなたはあなたが説明するものを手に入れるでしょう。
def say_boo_twice():
global boo
#boo = 'Boo!'
print boo, boo
boo = 'boo boo'
say_boo_twice()
また、そのglobal boo
は不要で、boo
はすでにグローバルスコープにあります。ここでglobal
が違いを生みます
def say_boo_twice():
global boo
boo = 'Boo!'
print boo, boo
say_boo_twice()
print "outside the function: " + boo #works
一方:
def say_boo_twice():
#global boo
boo = 'Boo!'
print boo, boo
say_boo_twice()
print "outside the function: " + boo # ERROR. boo is only known inside function, not to this scope
グローバルとして宣言した後、booを再割り当てしているため、値は最後に割り当てた値になります。 3行目を削除すると、期待どおりの出力が得られます。
基本的に、関数を呼び出すときにbooを再割り当てします。
これがglobals()およびlocals()関数でどのように機能するかを確認してください。
例を示す前に、Pythonのグローバル変数とローカル変数の違いを理解してほしい
グローバル変数:これは現在のモジュールに固有です
ローカル変数:これはPythonで呼び出す現在の関数またはメソッドに固有です
ローカル変数と現在の変数の両方が同じ名前である場合はどうなりますか?
このような場合、同じメソッドまたは関数で変数booをグローバルと定義しないと、デフォルトでローカル変数として使用されます。
あなたのコードに来る
メソッドでbooをグローバルとして定義しましたsay_boo_twice()。キャッチは、初期化しようとしたときですboo = 'Boo!'そのメソッドでは、以前に初期化したものをboo = 'booboo'として実際に上書きしています。
このコードを試してください
-メソッド内で変数booを初期化していませんsay_boo_twice()
def say_boo_twice():
global boo
print boo, boo
boo = 'boo boo'
say_boo_twice()
ではごきげんよう !!! !! !
グローバルブーイングはメソッドsay_boo_twice内でのみグローバルであり、このメソッド内で値が再割り当てされています。グローバルにすることができる字句またはスコープ、またはそれをどのようにしたいかを理解する必要があります。このコンテキストでは、印刷の直前に、「Boo!」の値が割り当てられました。それが正しく印刷されたものです。