Pythonインタラクティブガイド - ステップ3 関数 (5) - スコープ
- 本講座「Pythonインタラクティブガイド」は、手を動かしながらPythonプログラミングの基礎を学べるインタラクティブな講座です。
- 「スタイルガイド」では、Pythonで読みやすくきれいなコードを書くためのガイドライン(PEP8)を主に紹介しています。
- 各コード例はその場で実行して結果を確認できます。
ページ再読み込みで元に戻るので、自由に試してみてください。
「ステップ3 関数」の続きです。
3.4. スコープ
関数や変数などの識別子は、どこで定義されたかによってその識別子にアクセスできる範囲が決まります。
識別子にアクセスできる範囲のことをスコープ (scope) といいます。
3.4.1. LEGBルール
コード内に識別子が現れた際、次の順序で定義が探索されて、最初に見つかったものが使用されます。
このルールをその頭文字を取ってLEGBルールと呼びます。
- Local (ローカル): 現在の関数内のスコープ
- Enclosing (エンクロージング): (ネストされた関数の場合) 外側の関数のスコープ
- Global (グローバル): 現在のファイルのスコープ
- Built-in (ビルトイン):
print
関数,len
関数,True
などの組み込みのオブジェクトが存在するスコープ
Pythonに組み込まれた関数や定数(例:
print
, len
, True
)
現在のファイル内で定義された識別子
外側の関数のローカル変数などの識別子
現在の関数内で定義された変数などの識別子
→ このスコープから開始して、順に外側のスコープに探索範囲を広げていく
ローカルスコープ (Local)
関数内で定義された変数等の識別子は、その関数内だけで有効な「ローカルスコープ」を持ちます:
エンクロージングスコープ (Enclosing)
関数が別の関数の中に定義されている場合、外側の関数のローカルスコープを「エンクロージングスコープ」と呼びます。
エンクロージングスコープはローカルスコープの次に優先されます。
グローバルスコープ (Global)
ファイルレベルで定義された変数等の識別子は、そのファイル内のどこからでもアクセス可能な「グローバルスコープ」を持ちます。
グローバルスコープは、ローカルスコープ、エンクロージングスコープの次に優先されます。
ビルトインスコープ (Built-in)
Pythonには、len()
、print()
、min()
などの組み込み関数や、
True
、False
、None
などの組み込み定数が含まれる「ビルトインスコープ」が存在します。
ビルトインスコープは一番最後に探索されます。
次のコードを、結果を予想してから実行してみましょう:
解答例
3.4.2. global
宣言
これまでに見たように、関数内部からグローバル変数を参照することは可能でした。
しかし、関数内でグローバル変数の値を変更することはデフォルトではできません。
デフォルトでは、関数内で代入操作を行うと、ローカル変数を作成して代入してしまいます:
global
キーワードを使用すると、変数がグローバルスコープの識別子であることを宣言できます:
- 変数の
global
宣言を行うと、グローバル変数であることを明示して値の変更が可能になります - カンマ区切りで複数の変数を同時に宣言することも可能です
次のコードには不足している部分があります。
global
キーワードを適切に使用して、プログラムを修正しましょう。
解答例
プログラムが複雑になるにつれ、グローバル変数の使用は予期しない問題を引き起こす場合があります。
以下のことに注意しましょう:
- グローバル変数はできるだけ避ける - 代わりに関数の引数と戻り値を使いましょう
- 読み取り専用として使用する - 設定値など変更されないデータにのみ使いましょう
- 明示的な名前を使う - 変数の意図が明確になる名前を使いましょう
3.4.3. nonlocal
宣言
nonlocal
キーワードを使用すると、変数がエンクロージングスコープの識別子であることを宣言できます:
- 変数の
nonlocal
宣言を行うと、エンクロージングスコープの変数であることを明示して値の変更が可能になります - カンマ区切りで複数の変数を同時に宣言することも可能です
まとめ
この節では、識別子のアクセス可能な範囲を示す「スコープ」について学びました:
- LEGBルール:識別子を参照する順序(ローカル → エンクロージング → グローバル → ビルトイン)
global
宣言:global
キーワードを使用して、関数内からグローバル変数を変更する方法nonlocal
宣言:nonlocal
キーワードを使用して、内側の関数から外側の関数の変数を変更する方法
スコープの理解は、Pythonで複雑なプログラムを作成する上で非常に重要です。
グローバル変数の使用を最小限に抑え、可能な限り関数のパラメータと戻り値を活用することで、より保守性の高いコードを作成できます。