4

申し訳ありませんが、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

私がいつも最初に犬をインスタンス化すると仮定しますか?

私の質問は、何か違いはありますか?dog2番目の例では、最初の例と同じようにモジュールレベルの作成を開始しますglobvarか?それは同じように動作し、同じスコープを持ちますか?

4

2 に答える 2

9

global新しい変数を作成するのではなく、この名前がローカル変数ではなくグローバル変数を参照する必要があることを示しているだけです。通常、関数/クラス/...内の変数への割り当てはローカル変数を参照します。たとえば、次のような関数を取ります。

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

ここでは、グローバル変数がすでに存在するm場合でも、新しいローカル変数が作成されます。m一部の関数呼び出しは周囲のスコープの変数を予期せず変更してはならないため、これは通常必要なことです。本当にグローバル変数を変更し、新しいローカル変数を作成したくない場合は、次の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、dogを作成するときにmodule-global変数が作成されます。

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

実行:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1
于 2009-05-31T23:12:13.820 に答える
4

いいえ、ステートメントは、メソッドまたは関数内のグローバル変数に割り当てるglobal場合にのみ重要です。したがって、これは関係ありませ。グローバルは何も割り当てられていないため、グローバルは作成されません。__init__

于 2009-05-31T22:53:45.807 に答える