コンテンツ

Pythonインタラクティブガイド - ステップ3 関数 (5) - スコープ

シリーズ - Pythonインタラクティブガイド
Info
  • 本講座「Pythonインタラクティブガイド」は、手を動かしながらPythonプログラミングの基礎を学べるインタラクティブな講座です。
  • 「スタイルガイド」では、Pythonで読みやすくきれいなコードを書くためのガイドライン(PEP8)を主に紹介しています。
  • 各コード例はその場で実行して結果を確認できます。
    ページ再読み込みで元に戻るので、自由に試してみてください。

「ステップ3 関数」の続きです。

関数や変数などの識別子は、どこで定義されたかによってその識別子にアクセスできる範囲が決まります。
識別子にアクセスできる範囲のことをスコープ (scope) といいます。

コード内に識別子が現れた際、次の順序で定義が探索されて、最初に見つかったものが使用されます。
このルールをその頭文字を取ってLEGBルールと呼びます。

LEGBルール
  • Local (ローカル): 現在の関数内のスコープ
  • Enclosing (エンクロージング): (ネストされた関数の場合) 外側の関数のスコープ
  • Global (グローバル): 現在のファイルのスコープ
  • Built-in (ビルトイン): print関数, len関数, Trueなどの組み込みのオブジェクトが存在するスコープ
ビルトインスコープ (Built-in)
Pythonに組み込まれた関数や定数(例: print, len, True
グローバルスコープ (Global)
現在のファイル内で定義された識別子
エンクロージングスコープ (Enclosing)
外側の関数のローカル変数などの識別子
ローカルスコープ (Local)
現在の関数内で定義された変数などの識別子
→ このスコープから開始して、順に外側のスコープに探索範囲を広げていく

関数内で定義された変数等の識別子は、その関数内だけで有効な「ローカルスコープ」を持ちます:

関数が別の関数の中に定義されている場合、外側の関数のローカルスコープを「エンクロージングスコープ」と呼びます。
エンクロージングスコープはローカルスコープの次に優先されます。

ファイルレベルで定義された変数等の識別子は、そのファイル内のどこからでもアクセス可能な「グローバルスコープ」を持ちます。
グローバルスコープは、ローカルスコープ、エンクロージングスコープの次に優先されます。

Pythonには、len()print()min() などの組み込み関数や、
TrueFalseNone などの組み込み定数が含まれる「ビルトインスコープ」が存在します。

ビルトインスコープは一番最後に探索されます。

📚練習問題

次のコードを、結果を予想してから実行してみましょう:

解答例

これまでに見たように、関数内部からグローバル変数を参照することは可能でした。
しかし、関数内でグローバル変数の値を変更することはデフォルトではできません

デフォルトでは、関数内で代入操作を行うと、ローカル変数を作成して代入してしまいます:

globalキーワードを使用すると、変数がグローバルスコープの識別子であることを宣言できます:

global宣言
global 変数名
  • 変数のglobal宣言を行うと、グローバル変数であることを明示して値の変更が可能になります
  • カンマ区切りで複数の変数を同時に宣言することも可能です
📚練習問題

次のコードには不足している部分があります。
globalキーワードを適切に使用して、プログラムを修正しましょう。

解答例
スタイルガイド: グローバル変数の使用は最小限に

プログラムが複雑になるにつれ、グローバル変数の使用は予期しない問題を引き起こす場合があります。
以下のことに注意しましょう:

  1. グローバル変数はできるだけ避ける - 代わりに関数の引数と戻り値を使いましょう
  2. 読み取り専用として使用する - 設定値など変更されないデータにのみ使いましょう
  3. 明示的な名前を使う - 変数の意図が明確になる名前を使いましょう

nonlocalキーワードを使用すると、変数がエンクロージングスコープの識別子であることを宣言できます:

nonlocal宣言
nonlocal 変数名
  • 変数のnonlocal宣言を行うと、エンクロージングスコープの変数であることを明示して値の変更が可能になります
  • カンマ区切りで複数の変数を同時に宣言することも可能です

この節では、識別子のアクセス可能な範囲を示す「スコープ」について学びました:

  1. LEGBルール:識別子を参照する順序(ローカル → エンクロージング → グローバル → ビルトイン)
  2. global宣言globalキーワードを使用して、関数内からグローバル変数を変更する方法
  3. nonlocal宣言nonlocalキーワードを使用して、内側の関数から外側の関数の変数を変更する方法

スコープの理解は、Pythonで複雑なプログラムを作成する上で非常に重要です。
グローバル変数の使用を最小限に抑え、可能な限り関数のパラメータと戻り値を活用することで、より保守性の高いコードを作成できます。

関連記事