Python 3で、使用するすべての単一関数(定義している)として一部のグローバル変数をglobal
定義する必要があるのに、他の変数は1回だけ定義する必要があるのはなぜでしょうか。スコープがよくわからないので質問かもしれませんが、誰かに光を当てていただけませんか?
1 に答える
スコープ内の変数は読み取ることができますが、そのスコープ内で宣言された関数/オブジェクトによって変更することはできません。それらの値も変更したい場合は、それらをグローバルとして宣言する必要があります。
更新:ただし、Pythonでの割り当てはオブジェクトに名前を付けることを意味するため、「値の変更」は、他のプログラミング言語からの移行に最終的に慣れていることを意味する場合とそうでない場合があることに注意してください。キーワードglobal
を使用すると、指定された名前が別のオブジェクトを指す(関連付けられている)ようにすることができます。次の例を見てください。
aa = 1
bb = 2
cc = [ 1, 2, 3 ]
def test():
global aa
aa = -1
bb = -1
cc[2] = -1
test()
print "aa:", aa
print "bb:", bb
print "cc:", cc
結果は次のようになります。
aa: -1
bb: 2
cc: [1, 2, -1]
関数
test()
では、名前aa
はとして宣言されてglobal
いるためaa = -1
、関数では、グローバル名aa
が新しいオブジェクト、つまり整数を指すようになります-1
。の名前
bb
はtest()
グローバルとして宣言されていないため、割り当てによって関数内でローカルにbb = -1
名前が作成され、それがポイントされますが、グローバルスコープの名前は値をポイントしたままになります。bb
-1
bb
2
変数もグローバルとして宣言されていないため、関数でグローバル
cc
の関連付けを変更することはできません。ただし、グローバルスコープでは可変オブジェクトに関連付けられているため、関数内でこのオブジェクトのコンテンツを変更できます。cc
test()
cc
ここでの定式化は、違いを説明する公式のPythonの方法ではないかもしれませんが、他のプログラミング言語のバックグラウンドがある場合は、理解するのに役立つ場合があります。