2016-08-18 7 views
0

私はこのコードを試してました。リストは関数の中で暗黙的に「グローバル」ですか?

def a(): 
    #global p 
    p.append(4); 
    d=9 

p=[2,3]; 
d=8 
a(); 
print p # ----> [2, 3, 4] 
print d # ----> 8 

私はglobalキーワードを使用しなかったとして、変数d値が変更されていません。しかし、リストpは、私がglobalを使用していなくても機能が変更されました。すべてのリストは機能のデフォルトでglobalですか?

答えて

1

重要な違いは、ここでの割り当てです。既存のグローバルオブジェクトのメソッドを呼び出しても問題ありませんが、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 
+0

があった場合だけ、 '、p'を明確にする意味します'p'がグローバルではないにもかかわらず、' a'関数で表示されますか?これは他の多くの言語が正しく機能するかとは異なりますか? – mitoRibo

+2

@rbierman私はあなたが物事を後方に持っていると思います。 **モジュールのトップレベルで定義されたすべての名前はグローバルです**。しかし、関数宣言全体はPythonでは単一のスコープなので、名前 'x'はローカル変数*またはグローバル変数のいずれかを参照できます。関数の中で 'x'に代入をすると、その関数本体の中の' x'への*すべての*参照はそのローカル変数にあると決まります。割り当てが見つからなければ、pythonは囲みスコープを探し、グローバル名 'x'を見つけます。 – Bakuriu

+0

@ rbiermanこの例では 'p'がグローバルではないと言っていますか? –

関連する問題