重要な違いは、ここでの割り当てです。既存のグローバルオブジェクトのメソッドを呼び出しても問題ありませんが、global
を呼び出さずにメソッドに代入することはできません。あなたのコードでは、別の値を参照するためにd
という名前が再割り当てされています。あなたが割り当ててp
を変更した場合、あなたはPythonが初めて名前に遭遇したときに何が起こるかを考える場合、これは理にかなっても同様の結果
def a():
p = [5, 7] # new local variable, doesn't change global
p.append(9) # doesn't change global p
を持っていると思います。あなたが提供した関数では、Pythonはp.append
と表示され、 "hm、私はp
という名前でローカルを持っていません、囲みの範囲を見てみましょう。それはグローバルp
を見て、それを使用します。
私が示した例では、pythonは「明示的なglobal
はありませんので、これは新しいローカル変数であると仮定しています。 1つを作成します。
Pythonの名前は単なる参考情報です。 Pythonは、あなたが呼び出されるすべての関数のためのglobal
を必要とするだろう期待している動作が続く場合は、私が説明しましょう:
def a():
p.append(1) # I should need 'global p' to do this
これは、あなたが
def g():
...
def f():
g() # this would also need 'global g', otherwise how does it see g?
def f2():
global g
def g(): # changes the global g function
return 0
があった場合だけ、 '、p'を明確にする意味します'p'がグローバルではないにもかかわらず、' a'関数で表示されますか?これは他の多くの言語が正しく機能するかとは異なりますか? – mitoRibo
@rbierman私はあなたが物事を後方に持っていると思います。 **モジュールのトップレベルで定義されたすべての名前はグローバルです**。しかし、関数宣言全体はPythonでは単一のスコープなので、名前 'x'はローカル変数*またはグローバル変数のいずれかを参照できます。関数の中で 'x'に代入をすると、その関数本体の中の' x'への*すべての*参照はそのローカル変数にあると決まります。割り当てが見つからなければ、pythonは囲みスコープを探し、グローバル名 'x'を見つけます。 – Bakuriu
@ rbiermanこの例では 'p'がグローバルではないと言っていますか? –