このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】グローバル変数とglobal文

グローバル変数とglobal文

 Pythonにおけるグローバル変数は、関数の外側で定義された変数で、プログラム全体で参照可能です。しかし、関数内でグローバル変数の値を変更したい場合、単に変数に代入するとローカル変数が新たに作成され、グローバル変数は変更されません。この問題を解決するために、global文を使用して、関数内でグローバル変数を明示的に指定する必要があります。
 ここでは、グローバル変数とglobal文の基本的な使い方、そしてその効果を確認するサンプルプログラムと表を使って詳しく解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.グローバル変数の基本概念

1.1. グローバル変数とは

 グローバル変数は、関数の外側で宣言され、プログラム全体で有効な変数です。以下は、グローバル変数を定義して関数内外で参照する基本的な例です。

# グローバル変数の定義
greeting = "Hello, World!"

def display_greeting():
    # グローバル変数 greeting を参照
    print("Inside display_greeting:", greeting)

display_greeting()         # 出力: Inside display_greeting: Hello, World!
print("Outside:", greeting)  # 出力: Outside: Hello, World!

実行結果

Inside display_greeting: Hello, World!
Outside: Hello, World!

解説

  • greeting は関数の外側で定義されており、どの関数内からも参照できます。
  • このように、グローバル変数はプログラム全体で一貫したデータを保持するために利用されます。

1.2. グローバル変数の変更とglobal文

 関数内でグローバル変数に代入すると、新しいローカル変数が作成されてしまいます。グローバル変数を変更するには、関数内でglobal文を使って、その変数がグローバルスコープに属していることを明示する必要があります。

【基本構文】

def update_value():
    global var  # var がグローバル変数であることを宣言
    var = "Updated!"

var = "Original"
update_value()
print(var)  # 出力: Updated!

実行結果

Updated!

解説

  • global var により、関数update_value内でvarはグローバル変数として認識され、代入文によってその値が変更されます。
  • global文がない場合、関数内のvar = "Updated!"はローカル変数を作成し、グローバル変数varは変更されません。

2.サンプルプログラム:会員ステータスの更新

2.1. プログラムの概要

 以下のプログラムは、会員ステータスをグローバル変数として管理し、関数内でglobal文を用いてその値を変更する例です。初期状態ではステータスは "Member" ですが、関数を呼び出すと "Premium Member" に更新され、関数内外でその変更が反映されます。

def upgrade_membership():
    global membership  # グローバル変数 membership を指定
    membership = "Premium Member"  # グローバル変数の値を更新
    print("Inside upgrade_membership:", membership)

# グローバル変数の定義
membership = "Member"
print("Before upgrade:", membership)  # 出力: Before upgrade: Member

upgrade_membership()  # 関数を呼び出して会員ステータスを更新

print("After upgrade:", membership)  # 出力: After upgrade: Premium Member

実行結果

Before upgrade: Member
Inside upgrade_membership: Premium Member
After upgrade: Premium Member

解説

  • グローバル変数の定義
    membership = "Member" により、グローバル変数 membership を初期化します。
  • 関数内でのglobal文
    global membership によって、関数upgrade_membership内で membership がグローバル変数であることを宣言します。
    ・その後、membership = "Premium Member" によってグローバル変数の値が更新され、関数内での出力と、関数呼び出し後のグローバル変数の出力で変更が確認できます。

3.グローバル変数とglobal文のまとめ

3.1. 変数スコープの比較

変数の種類定義場所有効範囲変更方法(関数内)
グローバル変数関数の外側プログラム全体で有効global文を使用して明示的に変更
ローカル変数関数内その関数内でのみ有効関数内で通常の代入

解説

  • グローバル変数はプログラム全体で利用可能ですが、関数内で値を変更する場合は、global文を使ってその変数がグローバル変数であることを明示する必要があります。
  • これにより、意図しないローカル変数の生成や変数のスコープの混乱を避けることができます。

3.2. 複数のグローバル変数の宣言

global文は複数のグローバル変数を同時に宣言することが可能です。

def update_status():
    global status, level
    status = "Active"
    level = 5

status = "Inactive"
level = 0
update_status()
print("Status:", status)  # 出力: Active
print("Level:", level)    # 出力: 5

実行結果

Status: Active
Level: 5

解説

 global status, level により、関数内で statuslevel の両方がグローバル変数であることを宣言し、値を更新しています。

まとめ

 グローバル変数とglobal文は、関数内からプログラム全体で定義された変数を参照および変更するために必要な機能です。

  • グローバル変数: 関数の外側で定義され、プログラム全体で有効な変数。
  • global文: 関数内でグローバル変数にアクセスして変更する際に、その変数がグローバル変数であることを明示するために使用されます。
  • 注意点: global文がない場合、関数内で代入を行うと新しいローカル変数が作成されるため、グローバル変数の値は変更されません。
  • 複数宣言: 複数のグローバル変数を同時に宣言することも可能です。

 これらの知識を正しく理解し活用することで、グローバル変数の操作が安全かつ予測可能になり、プログラム全体のデータ管理が容易になります。