【Python】関数と変数のスコープ(ローカル変数, グローバル変数)
- 変数とは
- スコープとは
- ローカルスコープ
- グローバルスコープ
- nonlocal変数
- 名前空間とLEGBルール
- global文の使い方
- nonlocal文の使い方
- 変数スコープに関するベストプラクティス
変数とは
変数とは、データを格納するための名前付きの記憶領域のことを指す。Pythonでは、変数に値を代入することで自動的に型が決まる。
x = 10 # 整数型の変数
name = "Python" # 文字列型の変数
変数は特定のスコープ内でのみ有効であり、そのスコープの外ではアクセスできない場合がある。
スコープとは
スコープとは、変数が有効な範囲のことを指す。Pythonでは、変数のスコープを適切に管理することで、コードの可読性と保守性を向上させることができる。
ローカルスコープ
関数内で定義された変数はローカルスコープを持ち、その関数の外ではアクセスできない。
def my_function():
a = 5 # ローカル変数
print(a) # 5
my_function()
print(a) # NameError: name 'a' is not defined
関数内で定義された変数は、関数が終了すると自動的に破棄される。
グローバルスコープ
関数の外で定義された変数はグローバルスコープを持ち、プログラム全体でアクセスできる。
x = 10 # グローバル変数
def my_function():
print(x) # 10 (グローバル変数にアクセス)
my_function()
print(x) # 10
ただし、関数内でグローバル変数に値を代入するとエラーが発生する。
x = 10
def my_function():
x = x + 5 # UnboundLocalError: local variable 'x' referenced before assignment
my_function()
これは、Pythonが `x = x + 5` をローカル変数 `x` を用いた操作と解釈するためである。
nonlocal変数
関数内にネストした関数がある場合、外側の関数の変数を `nonlocal` キーワードを使って変更できる。
def outer():
x = 10
def inner():
nonlocal x
x += 5
print(x) # 15
inner()
print(x) # 15
outer()
名前空間とLEGBルール
Pythonの変数スコープには、LEGBルールが適用される。
- L (Local): 関数内で定義された変数
- E (Enclosing): 外側の関数の変数(nonlocalが適用される)
- G (Global): モジュールレベルの変数
- B (Built-in): Pythonの組み込み関数
このルールを理解することで、Pythonの変数のスコープを適切に管理できる。
global文の使い方
関数内でグローバル変数を変更するには、`global` 文を使う。
x = 10
def update_global():
global x
x += 5
print(x) # 15
update_global()
print(x) # 15
nonlocal文の使い方
`nonlocal` 文を使うと、ネストした関数の外側の変数を変更できる。
def outer():
y = 20
def inner():
nonlocal y
y += 10
print(y) # 30
inner()
print(y) # 30
outer()
変数スコープに関するベストプラクティス
- できるだけローカル変数を使用し、グローバル変数を避ける。
- 関数のネストを適切に行い、スコープを明確にする。
- `global` や `nonlocal` の使用は最小限にし、可読性を向上させる。