Pythonの名前空間とスコープの基本 – global文の使い方をわかりやすく解説
名前空間とは何か
変数とは、オブジェクトに対応付けられた名前(識別子)のことです。名前空間(namespace)は、変数名をキー、その変数が参照するオブジェクトを値とする辞書のような仕組みです。
ローカル名前空間とグローバル名前空間
Pythonのプログラムは、ローカル名前空間とグローバル名前空間の両方にある変数にアクセスできます。もしローカル変数とグローバル変数が同じ名前だった場合、ローカル変数が優先され、グローバル変数は覆い隠されます(シャドーイング)。
各関数はそれぞれ独自のローカル名前空間を持ちます。クラスのメソッドも、通常の関数と同じスコープの規則に従います。
Pythonが変数を判断するしくみ
Pythonは、変数がローカルかグローバルかを自動的に推測します。このとき、「関数内で値が代入されている変数はすべてローカル変数である」という前提で動作します。
そのため、関数の中でグローバル変数に値を代入したい場合は、あらかじめglobalステートメントを使って宣言しておく必要があります。
global 変数名 という宣言を行うと、その変数がグローバル変数であることがPythonに伝わり、Pythonはその変数をローカル名前空間から検索しなくなります。
具体例:UnboundLocalErrorが発生するケース
次の例では、グローバル名前空間に Money という変数を定義しています。一方、関数 AddMoney() の中でも Money に値を代入しているため、Pythonはこの Money をローカル変数と判断します。
しかし、コードでは値を代入する前にローカル変数 Money の値を読み取ろうとしているため、UnboundLocalError(未初期化のローカル変数へのアクセス)が発生します。コメントアウトされている global Money の行を有効にすれば、エラーは解消され、意図どおりに動作します。
#!/usr/bin/python
# -*- coding: utf-8 -*-
Money = 2000
def AddMoney():
# 次の行のコメントを外すとエラーが解消される
# global Money
Money = Money + 1
print(Money)
AddMoney()
print(Money)
まとめ
- 名前空間は「変数名 → オブジェクト」の対応関係を管理する辞書のようなもの
- 各関数は独自のローカル名前空間を持つ
- 関数内で代入された変数は、デフォルトでローカル変数として扱われる
- 関数内でグローバル変数を変更するには
global文による宣言が必須
-
Pythonでグローバル変数を宣言する方法!globalキーワードの使い方を徹底解説
グローバル変数とは?グローバル変数とは、関数の外側で宣言された変数であり、関数の内側でも利用できる変数のことです。サンプルコードdef func(): print(a) a = 10 func()出力結果10この例では、変数 a は関数の外側で宣言されているため、グローバル変数として扱われます。関数の中からでも参照できるため、変数 a のスコープ(有効範囲)はプログラム全体に及びます。関数内で同名の変数を定義するとどうなる?次に、関数の中でグローバル変数と同じ名前の変数を新しく作った場合の挙動を見てみましょう。上記の例のように、変数 a が関数の外側で宣言されていれば、それはグローバル
-
Pythonの名前空間とスコープの仕組みをわかりやすく解説
Pythonでは、変数・関数・ライブラリ・モジュールなど、さまざまな「名前」を扱います。ところが、使おうとした変数名が、すでに別の変数や関数、メソッドの名前として存在している――そんな場面に遭遇することは珍しくありません。このような名前の衝突を避けるためにも、Pythonがこれらの名前をどのように管理しているのかを理解しておく必要があります。その鍵となるのが「名前空間(namespace)」という概念です。 名前空間の3つの種類 Pythonの名前空間は、大きく次の3つに分類されます。 ローカル名前空間(Local Namespace)関数の中で定義された変数や関数の名前を保持する名前空