Pythonのglobal文:関数からグローバル変数を変更する方法

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つのルールを覚えておくと非常に役立ちます。

  1. 関数内で代入されれば、その変数はローカル変数になるglobal文を使わない限り)。
  2. global文を使っていれば、その変数はグローバル変数になる
  3. 関数内で代入されていなければ、その変数はグローバル変数になる(読み取り専用)。

以下のコードは、これらのルールを一度に確認できる例です。

# グローバル変数を定義
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文は便利な機能ですが、その使い方と影響範囲をよく理解して慎重に使いましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次