Pythonの変数スコープの概念について
Pythonの変数のついてはLEGBルールという概念に基づきます。
LEGBはローカル、エンクロージング、グローバル、組み込み関数をスコープとして、スコープの検索順序を表します。各スコープについて説明します
LEGBについて
変数を参照するとき、Pythonは以下の順序でスコープを検索します。
- ローカル
- エンクロージング
- グローバル
- 組み込み関数
各スコープについて解説をしてきたいと思います。
ローカルスコープについて
関数内部で定義された変数は、ローカルスコープとなります。
関数内のみで有効となるため、関数外からのアクセスはエラーとなります。
def local_scope_function():
#ローカルスコープ
local_var = "ローカル変数"
print(local_var)
def test_module():
local_scope_function()
# print(x) # NameError: name 'x' is not defined
エンクロージングスコープについて
関数内にネストされた関数がある場合、ネストされた関数からアクセスができます。
ネストされた関数は、外部のスコープを参照します。
def enclosing_scope_function():
#外側のスコープ
enclosing_var = "外側の変数"
def local_scope_function():
print(enclosing_var)
local_scope_function()
def test_module():
enclosing_scope_function()
グローバルスコープについて
上位で定義された変数がグローバル変数となり、どこからでもアクセスが可能となります。
global
キーワードを使用して、関数内からグローバル変数を変更することが可能となります。
x = 10
def global_scope_function():
global x
x = 20
def test_module():
print(f"{x=}")
global_scope_function()
print(f"{x=}")
global_scope_functionを以下のようにすると、global_scope_function内のxはローカル変数として扱われるため、グローバル変数xは更新されません。
x = 10
def global_scope_function():
x = 20
def test_module():
print(f"{x=}")
global_scope_function()
print(f"{x=}")
ビルトインスコープについて
Pythonには標準ライブラリとして多くの組み込み関数や定数が定義されています。
これらについてはどこからでもアクセス可能となります。
# 例えばlenは組み込み関数となるため、どこからでもアクセス可能
print(len[1,2,3,4,5])
※ビルトインスコープについては念のため記載していますが、今回の説明する変数のスコープについての解説とは少し趣旨がずれるかもしれません。
まとめ
Pythonではスコープを意識する必要があります。変数がどのスコープに属しているかでアクセス範囲が変わります。アクセス範囲についてはLEGBルールに従って決まります。