Pythonを学び始めたときに混乱しやすいのが「変数のスコープ」です。
スコープとは**「変数が使える範囲」**のことです。スコープを理解していないと、「変数が見つからない」「値が更新されない」といったエラーの原因になります。
この記事では、local・global・nonlocal の違いと使い方を初心者向けに解説します。
この記事の対象
変数とは
関数における変数にはルールがあります。Local変数とGlobal変数と使い分ける必要があります。関数内で利用した変数は関数の外では使用できません。
変数についてはこちらを参照してください。
スコープとは?
スコープ | 内容 |
---|---|
local | 関数の中だけ有効 |
global | プログラム全体で有効 |
nonlocal | ネストされた関数内で外側の変数にアクセス |
localスコープ(関数内の変数)
def my_func():
x = 10
print(x)
my_func() # 10
print(x) # NameError: name 'x' is not defined
ポイント
- 関数内で定義した変数は、その関数の外では使えない
globalスコープ(プログラム全体で使える変数)
x = 5
def my_func():
print(x)
my_func() # 5
print(x) # 5
ポイント
- 関数外で定義した変数は、関数内からも参照できる
globalキーワードで値を変更
math = 80
def test():
global math
math = 70
test()
print("math=",math)
注意
global
は便利だが、変数の管理が複雑になるので乱用は避ける
nonlocal(ネストされた関数で外側の変数を変更)
def outer():
x = "outer"
def inner():
nonlocal x
x = "inner"
inner()
print(x)
outer() # inner
ポイント
- 関数の中に関数がある場合、外側関数の変数を書き換えるときに使う
スコープに関するよくあるエラー
エラー例 | 原因 | 対策 |
---|---|---|
NameError | 変数がスコープ外 | 定義位置を確認 |
UnboundLocalError | 関数内で代入しているのに global /nonlocal を指定していない | キーワードを使う |
まとめ
- local:関数内だけ有効
- global:プログラム全体で有効
- nonlocal:ネスト関数の外側変数を変更
- スコープを理解すればエラーを減らせる