の実行前にそれらを宣言しているため、この質問は説明を少し必要があるかもしれませんオーケー関数本体にc
とa
を宣言する必要はありません。
ネストスコープをサポートするほとんどの言語では、最も近い囲み範囲内の任意の名前を、コードを参照することができ、または(に割り当て)再バインド:
PEP 3104は、と述べています。現在のところ、Pythonコードは囲みスコープ内の名前を参照できますが、ローカルスコープ(単純な割り当て)またはモジュールグローバルスコープ(グローバル宣言を使用)の2つのスコープでのみ名前を再バインドできます。あなたはここで理解しておく必要があり
2つのことがあること:
明示されているように、ローカルスコープ内でのみ名前を再バインドできます。
例:
def func():
a=5
print(a)
a=10
print("a in the program")
print(a)
print("a in func()")
func()
は出力:
a in the program
10
a in func()
5
今func()
からa=5
を削除して、あなたが得る:
a in the program
10
a in func()
10
a
が10
、それであることを何が起こるのを発見されます印刷されます。あなたが関数内でa=5
を与えるとどう
UnboundLocalError: local variable 'a' referenced before assignment
:あなたがこれを取得
def func():
print(a)
a=5
a=10
print("a in the program")
print(a)
print("a in func()")
func()
:
今これを行いますか?
いいえ再バインドの代わりに、新しいローカル変数a = 5が作成されるようになりました。
ので、
名への割り当ては、暗黙的に名前がローカルであることを宣言ししかし、(グローバル宣言はグローバルであることを名前を強制する場合を除く)、外側のスコープに名前を再バインドことは不可能です。
ですから、global a
を使用する場合、印刷は、(a)は喜ん10
などのグローバルa
を印刷し、その後に5を結合することによって、新たなローカル変数a=5
を作成します。
global a
print(a)
a=5
print(a)
出力:
def func():
global a
print(a)
a=5
print(a)
a=10
print("a in the program")
print(a)
print("a in func()")
func()
しかし、これはlist
、dict
などのようなあなたの他のオブジェクトとそうではありません。 この場合、通常の名前検索で見つかった既存のグローバルオブジェクトを変更しているだけです(リストエントリの変更はリストのメンバー関数を呼び出すようなものですが、名前の再バインドではありません)。
したがって、エラーは発生しません。あなたが何かを理解してもらいたいと思います
あなたは 'c'に割り当てていません。与えられたインデックスの値を設定するために、* it *に* cを変更しています。言い換えれば、 'c [...] = ...'は 'c = ...'と大きく異なります。 –
https://stackoverflow.com/questions/291978/short-description-of-the-scoping-rules –
短い答えはリストが変更可能であり、整数が不変であるためです。 – Anup