Pythonのモジュールのグローバル変数対__init__グローバル
質問
謝罪、やや混乱して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__
は無関係です - 。それには何も割り当てていないので、それが に、グローバルを作成しません。