Pythonでは、変数の有効範囲(スコープ)によって、変数がアクセス可能な範囲が決まります。変数にはローカル変数とグローバル変数の2種類があり、それぞれ異なるスコープを持っています。
この記事では、ローカル変数とグローバル変数の違い、使い方、スコープに関する詳細について解説します。
グローバル変数とは?
グローバル変数とは、
プログラム全体でアクセスできる変数のことです。関数の外側で定義された変数は、グローバルスコープを持ち、スクリプト全体のどこからでもアクセスできます。
例: グローバル変数の定義とアクセス
x = 10 # グローバル変数
def display_x():
print(x) # 関数内でもグローバル変数にアクセス可能
display_x() # 10
print(x) # 10
この例では、x は関数の外で定義されているため、グローバル変数となります。関数内でも、関数の外でも x にアクセスできます。
グローバル変数の特徴
-
スコープ
プログラム全体(モジュール全体)がスコープとなります。 -
関数内からの参照
関数内からでも読み取り可能です(ただし、関数内で変更するには特別な宣言が必要です)。
ローカル変数とは?
ローカル変数は、関数の内部で定義された変数で、その関数内でのみ有効です。関数の外からはローカル変数にアクセスすることはできず、関数の処理が終了するとローカル変数は破棄されます。
例: ローカル変数の定義とスコープ
def my_function():
y = 5 # ローカル変数
print(y)
my_function() # 5
# print(y) # エラー: yは関数の外では参照できない
この例では、y は my_function() 関数の内部で定義されたローカル変数です。関数の外では y にアクセスできないため、エラーが発生します。
ローカル変数の特徴
-
スコープ
定義された関数内のみがスコープです。 -
外部からのアクセス不可
関数の外からローカル変数にアクセスすることはできません。
ローカル変数とグローバル変数の違い一覧表
グローバル変数を関数内で変更する方法
関数内でグローバル変数を変更するには、global キーワードを使って、その変数がグローバルスコープにあることを明示する必要があります。これを使わない場合、関数内でグローバル変数に同じ名前の変数を定義すると、ローカル変数として扱われてしまいます。
例: global キーワードの使用
x = 10 # グローバル変数
def modify_x():
global x # グローバル変数を参照
x = 20 # グローバル変数を変更
modify_x()
print(x) # 20
この例では、global x を使って、関数内でグローバル変数 x を参照し、その値を変更しています。
ローカル変数とグローバル変数の同名の処理
関数内でローカル変数とグローバル変数が同じ名前を持っている場合、Pythonはローカル変数を優先します。そのため、関数内で同じ名前の変数を使うと、ローカルスコープでの処理が行われ、グローバル変数には影響を与えません。
例: ローカルとグローバル変数が同名
x = 10 # グローバル変数
def my_function():
x = 5 # ローカル変数
print(x) # ローカル変数が優先される
my_function() # 5
print(x) # 10(グローバル変数は影響を受けない)
この例では、関数内の x はローカル変数として扱われ、グローバル変数 x は変更されません。
関数内での変数の優先順位(LEGB ルール)
Pythonには、LEGB ルールと呼ばれる変数のスコープを探索する順序があります。これは、Pythonが変数を解決する際にどのスコープを優先して探すかを示しています。
-
Local: 関数内で定義されたローカル変数が最優先です。
-
Enclosing: 関数をネストしている外側の関数の変数。
-
Global: モジュールレベルのグローバル変数。
-
Built-in: Pythonのビルトイン関数や定数。
例: LEGB ルール
x = 10 # グローバル変数
def outer_function():
x = 20 # Enclosing スコープの変数
def inner_function():
x = 30 # Local スコープの変数
print(x) # Local スコープが優先される
inner_function()
outer_function() # 30
この例では、inner_function() 内で x が定義されているため、ローカルスコープが最優先されます。
まとめ
-
グローバル変数は、関数の外で定義され、プログラム全体でアクセスできる変数です。関数内からも読み取れますが、変更するには global キーワードが必要です。
-
ローカル変数は、関数の内部で定義され、その関数内でのみ有効です。関数外からはアクセスできません。
-
同名の変数が関数内外で存在する場合、関数内ではローカル変数が優先され、グローバル変数は影響を受けません。
-
PythonはLEGB ルールに従って、ローカル、エンクロージング、グローバル、ビルトインの順に変数を探索します。
コメント