シャドウイング
外側のスコープで作られた識別子と同じ名前の識別子を、より内側のスコープで作ることをシャドウイングという。結果として、外側のスコープに属する識別子は、内側のスコープにおいては新たに作った識別子により覆い隠される。
code:shadow1.py
x = 'グローバル変数'
def func():
x = 'ローカルスコープ' # (1)
print('In func:', x)
print('In Global:', x) # (2)
func()
print('In Global:', x) # (3)
関数funcが形成するローカルスコープにおいて、代入(1)によりグローバル変数xはローカル変数xで覆い隠される。
隠された側の変数はメモリ上に変数は存在し続けており、単に見えなくなっているだけである。処理の流れが外側スコープに復帰すると、内側スコープに属する変数は削除され、外側スコープの変数名が見えるようになる。
Pythonでは、新規の変数に対する代入文が実行されると、「変数の定義(具体的に変数を作ること)」と「値の代入」が同時に行われるため、(1)のような代入文が「既存の変数への代入」なのか、「変数を新たに定義したうえでの代入」が行われているのかを読み取る必要がある。