Pythonのglobals関数を解説

Python

本記事ではPythonの組み込み関数であるglobals関数について解説します。

globals()関数

ざっくり言うと、globals関数は現在のモジュール(ファイル)内のグローバルな変数や関数を辞書として返す関数です。

Pythonのドキュメントではglobals()は以下のように定義されています。

現在のモジュールの名前空間を実装した辞書を返します。関数内のコードに対しては、関数が定義されるときに辞書が設定され、その関数がどこから呼ばれたかにかかわらず同じ内容になります。

この定義のままではわかりずらいので、順番に解説していきます。

globals() の基本動作

まず、次の部分を分かりやすく説明します。

現在のモジュールの名前空間を実装した辞書を返します。

これは、「Pythonが現在動作しているモジュール(スクリプトや import されたファイル)の変数や関数、クラスなどの一覧を辞書として取得できる」という意味です。

たとえば、次のようなコードを考えます。

x = 10  # グローバル変数
def foo():
    print(globals())  # グローバル変数や関数の一覧を取得

foo()

これを実行すると、globals()x = 10foo という関数を含む辞書を返します。

# 出力結果
{'__name__': '__main__', ..., 'x': 10, 'foo': <function foo at 0x...>}

globals() のスコープの特性

次の部分を解説します。

関数内のコードに対しては、関数が定義されるときに辞書が設定され、その関数がどこから呼ばれたかにかかわらず同じ内容になります。

これは、「globals() は関数の実行時ではなく、その関数が定義された時点のモジュールの情報を返す」という意味です。

具体的な例を見てみましょう。

x = 5

def foo():
    print(globals()['x'])  # x は 5

def bar():
    global x
    x = 20  # グローバル変数を書き換え
    foo()  # foo() を実行しても、x は現在のグローバル値を参照する

bar()  # -> 20 が表示される

このコードでは、foo()globals() は、bar() の中から呼び出されてもグローバル変数 x を常に参照することがわかります。つまり、「foo() がどこで実行されたか」ではなく、「foo() が定義された時点のグローバルスコープを見に行く」ということです。

globals()関数のまとめ

  1. globals() は現在のモジュール(ファイル)の変数や関数を辞書として返す。
  2. 関数の中から globals() を呼んでも、その関数が定義されたモジュールの情報を参照する。
  3. 関数がどこから呼ばれても、グローバルスコープの内容は変わらない。(関数の定義時に決まる)

loacals()との違い

globals() と似た関数に locals() がありますが、この2つには明確な違いがあります。

関数返す内容影響範囲
globals()グローバルスコープの変数や関数を辞書で取得モジュール全体
locals()関数やブロック内のローカル変数を辞書で取得実行中のスコープ

locals() は関数内で呼び出すと、その関数内のローカル変数を辞書として返します。

x = 10  # グローバル変数

def foo():
    y = 20  # ローカル変数
    print("locals:", locals())  # y のみが出力される
    print("globals:", globals())  # x も含まれる

foo()
# 出力結果
locals: {'y': 20}
globals: {'__name__': '__main__', ..., 'x': 10, 'foo': <function foo at 0x...>}

globals() はモジュール内の変数 x を取得できますが、locals() は関数内の y しか取得できません。

このように、globals() はモジュール内のすべての変数を取得できますが、locals()関数内のローカル変数だけを取得 します。

locals() の動的変更はできない

globals() は辞書を変更すればグローバル変数の値を変更できますが、locals() の場合は関数内のローカル変数を変更することはできません。

def foo():
    y = 10
    locals()['y'] = 50  # 変更できない
    print(y)  # 10 のまま

foo()

このコードでは、locals()['y'] = 50 としても y の値は変わりません。

Python の仕様上、locals() の辞書を書き換えても、その変更は関数のローカルスコープには反映されません。

まとめ

  • globals() はグローバルスコープの変数・関数の一覧を取得でき、変更も可能
  • locals() は現在のスコープ(関数など)の変数を取得できるが、変更はできない
  • locals() は関数が「実行されたときのローカルスコープの情報」を取得する
  • 関数の定義時ではなく、実行時の変数の状態を取得する点が globals() との違い

どちらもスコープ内の変数を取得するための便利な関数ですが、globals() はグローバルスコープの管理や動的な変数操作に向いており、locals() は主にデバッグや関数内の変数確認に使われます。用途に応じて適切に使い分けることで、より理解しやすく保守性の高いコードを書くことができます。

タイトルとURLをコピーしました