Python のスコープ
1. スコープ (Scope)
変数(Variable)は、それが作成されたリージョン(領域)内でのみ利用可能です。これをプログラミングの世界ではスコープ(Scope)と呼びます。
2. ローカルスコープ (Local Scope)
関数(Function)の内部で作成された変数は、その関数のローカルスコープに属し、その関数内でのみ使用できます。
2.1 ローカル変数の例
関数内で作成された変数は、関数外部からは参照できません。
def myfunc():
x = 300 # ローカルスコープの変数
print(x)
myfunc()2.2 関数内の関数 (Function Inside Function)
上記の例のように、変数 x は関数の外部からは利用できませんが、その関数内にある別の関数(ネストされた関数)からはアクセスすることが可能です。
def myfunc():
x = 300
def myinnerfunc():
print(x) # 親関数のローカル変数を参照
myinnerfunc()
myfunc()3. グローバルスコープ (Global Scope)
Python コードのメインボディ(関数の外側)で作成された変数はグローバル変数であり、グローバルスコープに属します。
グローバル変数は、グローバルスコープ内だけでなく、任意の関数内部(ローカルスコープ)からもアクセスすることが可能です。
3.1 グローバル変数の例
関数の外で定義された変数は、どこからでも読み取ることができます。
x = 300 # グローバル変数
def myfunc():
print(x)
myfunc()
print(x)3.2 変数の命名 (Naming Variables)
関数内と関数外で同じ名前の変数を操作した場合、Python はそれらを 2 つの別個の変数として扱います。一方はグローバルスコープに属し、もう一方は関数内のローカルスコープに属します。
x = 300 # グローバルな x
def myfunc():
x = 200 # ローカルな x
print(x)
myfunc() # 200 を出力
print(x) # グローバルな 300 を出力4. global キーワード
通常、関数内で変数を作成すると、それはローカル変数となり、その関数内でしか利用できません。しかし、global キーワードを使用すれば、関数内からグローバル変数を作成したり、既存のグローバル変数を更新したりすることができます。
4.1 global キーワードによる宣言
関数内からグローバルスコープの変数を定義する例です。
def myfunc():
global x
x = 300 # global 宣言により、この x はグローバル変数になる
myfunc()
print(x)また、関数内から既存のグローバル変数の値を変更したい場合にも global を使用します。
x = 300
def myfunc():
global x
x = 200 # グローバルな x を 200 に更新
myfunc()
print(x) # 200 を出力5. nonlocal キーワード
nonlocal キーワードは、ネストされた関数(関数の中の関数)において使用されます。このキーワードを使うことで、その変数がローカルスコープではなく、一つ外側の関数(エンクロージングスコープ)に属していることを明示できます。
5.1 nonlocal の使用例
内側の関数から外側の関数の変数を変更する例です。
def myfunc1():
x = "最初"
def myfunc2():
nonlocal x
x = "変更後"
myfunc2()
return x
print(myfunc1())このように nonlocal を使うことで、クロージャ(Closure)などの高度な実装において、外側の状態を適切に管理することが可能になります。