本記事ではPythonの組み込み関数であるglobals関数について解説します。
globals()関数
ざっくり言うと、globals関数は現在のモジュール(ファイル)内のグローバルな変数や関数を辞書として返す関数です。
Pythonのドキュメントではglobals()は以下のように定義されています。
現在のモジュールの名前空間を実装した辞書を返します。関数内のコードに対しては、関数が定義されるときに辞書が設定され、その関数がどこから呼ばれたかにかかわらず同じ内容になります。
この定義のままではわかりずらいので、順番に解説していきます。
globals() の基本動作
まず、次の部分を分かりやすく説明します。
現在のモジュールの名前空間を実装した辞書を返します。
これは、「Pythonが現在動作しているモジュール(スクリプトや import
されたファイル)の変数や関数、クラスなどの一覧を辞書として取得できる」という意味です。
たとえば、次のようなコードを考えます。
x = 10 # グローバル変数
def foo():
print(globals()) # グローバル変数や関数の一覧を取得
foo()
これを実行すると、globals()
は x = 10
や foo
という関数を含む辞書を返します。
# 出力結果
{'__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()関数のまとめ
globals()
は現在のモジュール(ファイル)の変数や関数を辞書として返す。- 関数の中から
globals()
を呼んでも、その関数が定義されたモジュールの情報を参照する。 - 関数がどこから呼ばれても、グローバルスコープの内容は変わらない。(関数の定義時に決まる)
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()
は主にデバッグや関数内の変数確認に使われます。用途に応じて適切に使い分けることで、より理解しやすく保守性の高いコードを書くことができます。