Pythonのモジュールのグローバル変数対__init__グローバル

StackOverflow https://stackoverflow.com/questions/933042

  •  06-09-2019
  •  | 
  •  

質問

謝罪、やや混乱してPythonの初心者の質問。のは、私がanimals.pyと呼ばれるモジュールがあるとしましょう.......

globvar = 1

class dog: 
   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

この違いは何ですと

class dog:
   def __init__(self):
      global globvar

   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

私はいつも最初に犬をインスタンス化と仮定?

私は私の質問があると思い、どんな違いがあるのでしょうか?第二の例では、dogは、同じように動作し、同じスコープを持つことになりますちょうど最初の例のように、モジュールレベルのglobvarを、作成開始するのですか?

役に立ちましたか?

解決

globalは、新しい変数を作成しません、それだけでこの名前がグローバル変数の代わりに、ローカルのいずれかを参照すべきであると述べています。通常の関数/クラス内の変数への代入/ ...ローカル変数を参照してください。たとえば、次のように機能を取ります:

def increment(n)
  # this creates a new local m
  m = n+1
  return m

ここでは、新しいローカル変数mは、すでに既存のグローバル変数mがあるかもしれない場合でも、作成されます。これは、いくつかの関数呼び出しが予期せず、周囲のスコープ内の変数を変更してはなりませんので、あなたは通常、何をしたいです。あなたは確かにグローバル変数を変更していない新しいローカル1を作成したい場合は、あなたがglobalキーワードを使用することができます:

def increment(n)
  global increment_calls
  increment_calls += 1
  return n+1

あなたのケースでは、コンストラクタでglobalは、すべての変数を作成しません、globvarにアクセスするための更なる試みは失敗します:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "animals.py", line 7, in bark
    print globvar
NameError: global name 'globvar' is not defined

しかし、あなたが実際にコンストラクタでglobvarに値を代入するならば、あなたが犬を作成するときに、モジュールのグローバル変数が作成されます。

class dog:
   def __init__(self):
      global globvar
      globvar = 1
...

実行ます:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1

他のヒント

あなたがの割り当てのメソッドや関数内でグローバル変数にしているとき、

いいえ、global文は唯一重要。だから__init__は無関係です - 。それには何も割り当てていないので、それが に、グローバルを作成しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top