web-dev-qa-db-ja.com

Pythonグローバル変数

def say_boo_twice():
  global boo
  boo = 'Boo!'
  print boo, boo

boo = 'boo boo'
say_boo_twice()

出力は

ブー!ブー!

思った通りではありません。 booをグローバルとして宣言したので、出力が次のようにならないのはなぜですか。

ブーブーブーブー

14
Don Lun

関数内でbooを変更しましたが、なぜ変更しないのですか?また、グローバル変数は悪いです。

25
Dr McKay

直前に再割り当てするためです。コメントアウト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
17
jon_darkstar

グローバルとして宣言した後、booを再割り当てしているため、値は最後に割り当てた値になります。 3行目を削除すると、期待どおりの出力が得られます。

5
josePhoenix

基本的に、関数を呼び出すときにbooを再割り当てします。

これがglobals()およびlocals()関数でどのように機能するかを確認してください。

3
mcpeterson

例を示す前に、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()

ではごきげんよう !!! !! !

0

グローバルブーイングはメソッドsay_boo_twice内でのみグローバルであり、このメソッド内で値が再割り当てされています。グローバルにすることができる字句またはスコープ、またはそれをどのようにしたいかを理解する必要があります。このコンテキストでは、印刷の直前に、「Boo!」の値が割り当てられました。それが正しく印刷されたものです。

0
NullException