Pythonの変数スコープについて学ぶと、関数の中からグローバル変数の値を読み取ることはできるものの、直接変更することはできない、というルールがあることを知ります。しかし、どうしても関数の中からグローバル変数を変更したい場面が出てくることがあります。
この記事では、そのための特別なキーワード、global
文について、その役割と使い方を分かりやすく解説します。
global
文とは?
global
文は、関数内で使用する変数がグローバルスコープで定義されていることを明示的にPythonに伝えるための命令です。これにより、関数内で行われた変数の代入が、ローカル変数ではなく、グローバル変数の値を更新するように変更されます。
global
文がない場合(変更できない)
まずは、global
文を使わずにグローバル変数を変更しようとするとどうなるか見てみましょう。以下のコードは、count_up
関数内でグローバル変数count
の値を増やそうとしています。
# グローバル変数を定義
count = 0
def count_up():
# グローバル変数 count を変更しようとしている
count = count + 1
print(f"関数内のカウント: {count}")
print(f"開始時のカウント: {count}")
count_up()
print(f"関数実行後のカウント: {count}")
実行結果:
開始時のカウント: 0
関数内のカウント: 1
関数実行後のカウント: 0
なぜ最後の出力が1
にならないのでしょうか?これは、関数内でcount = count + 1
という代入が行われた時点で、Pythonが**count
を関数のローカル変数**だと判断し、グローバル変数のcount
とは別の新しい変数を作成してしまうからです。
global
文がある場合(変更できる)
この問題を解決するのがglobal
文です。関数内でglobal 変数名
と宣言することで、その変数はグローバル変数と同じものを指すようになります。
# グローバル変数を定義
count = 0
def count_up_with_global():
# countはグローバル変数であることを宣言
global count
# グローバル変数 count の値を変更する
count = count + 1
print(f"関数内のカウント: {count}")
print(f"開始時のカウント: {count}")
count_up_with_global()
print(f"関数実行後のカウント: {count}")
実行結果:
開始時のカウント: 0
関数内のカウント: 1
関数実行後のカウント: 1
global count
と宣言したことで、関数内のcount
がグローバルスコープのcount
を指すようになり、値が正しく更新されました。
global
文を使う際の3つのルール
変数のスコープを理解するために、以下の3つのルールを覚えておくと非常に役立ちます。
- 関数内で代入されれば、その変数はローカル変数になる(
global
文を使わない限り)。 global
文を使っていれば、その変数はグローバル変数になる。- 関数内で代入されていなければ、その変数はグローバル変数になる(読み取り専用)。
以下のコードは、これらのルールを一度に確認できる例です。
# グローバル変数を定義
message = "Hello, world."
def modify_global():
# global文を使ってグローバル変数を変更
global message
message = "Hello, Python."
def read_global():
# global文なしでグローバル変数を読み取る
print(f"関数内から読み取ったメッセージ: {message}")
def create_local():
# 代入を行うと、messageはローカル変数になる
message = "This is a local message."
print(f"関数内で作成されたローカルメッセージ: {message}")
# 実行
print(f"元のグローバルメッセージ: {message}") # 出力: Hello, world.
read_global() # 出力: 関数内から読み取ったメッセージ: Hello, world.
create_local() # 出力: 関数内で作成されたローカルメッセージ: This is a local message.
print(f"ローカル関数実行後のグローバルメッセージ: {message}") # 出力: Hello, world. (変化なし)
modify_global()
print(f"global関数実行後のグローバルメッセージ: {message}") # 出力: Hello, Python. (変化あり)
この例から、global
文を使わない限り、関数内の代入はグローバル変数に影響を与えないことが分かります。
まとめ
今回は、Pythonでグローバル変数を関数内から変更するためのglobal
文について解説しました。
global
文は、関数内で変数を更新する際に、その変数がローカルではなくグローバルであることを明示的に示すために使います。global
文は、変数を代入によって変更したい場合にのみ必要です。読み取るだけであれば不要です。- 無秩序な
global
文の使用は、プログラムの挙動を追いにくくするため、できるだけ避けるべきとされています。関数の引数や戻り値を使ってデータをやり取りする方が、一般的に良いプラクティスとされています。
global
文は便利な機能ですが、その使い方と影響範囲をよく理解して慎重に使いましょう。