Python globalの使い方

この記事のポイント

Pythonのglobalキーワードは、関数の中からグローバル変数を変更するために使用する宣言です。

この記事を読むと、次のようなことが身に付きます。

  • グローバル変数の基本的な仕組みがわかる
  • globalキーワードを使った変数の操作方法がわかる
  • globalキーワードの注意点と活用例を知る

この記事を通して、globalキーワードの正しい使い方をマスターすれば、関数間でデータを共有するプログラムが書けるようになります。

目次

globalとは?

globalキーワードは、関数の中からグローバル変数(関数の外で定義された変数)の値を変更したいときに使用する宣言です。

Pythonでは、関数の中で新しく変数に値を代入すると、通常はローカル変数として扱われます。ローカル変数はその関数の中だけで有効な変数で、関数の外からは使えません。

関数の外にあるグローバル変数の値を読み取るだけなら、global宣言は必要ありません。

しかし、関数の中でグローバル変数の値自体を書き換えたい(新しい値を代入したい)場合は、global変数名と記述して、「これはローカル変数ではなく、関数の外にあるグローバル変数を操作します」とPythonに明示的に伝える必要があります。

globalキーワードの特徴

  • 関数内からグローバル変数の値を変更(再代入)できる
  • global宣言なしで関数内で代入すると新しいローカル変数が作成される
  • グローバル変数の値を読み取るだけの場合はglobal宣言は不要
  • 複数の関数間でデータを共有する手段として利用できる

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

基本構文

Pythonでglobalキーワードを使うときの基本的な構文を見ていきましょう。globalキーワードは関数定義内で使用し、変数名の前に記述します。

最初に、globalキーワードを使って関数内でグローバル変数を変更する、基本的な使い方を紹介します。

# グローバル変数の定義 animal = "イヌ" def change_animal(): # 関数内でグローバル変数を変更するためにglobalキーワードを使用 global animal animal = "ネコ" print(f"関数内: animal = {animal}") # 関数呼び出し前の値 print(f"関数呼び出し前: animal = {animal}") change_animal() # 関数呼び出し後の値(変更されていることに注目) print(f"関数呼び出し後: animal = {animal}")

出力結果

関数呼び出し前: animal = イヌ
関数内: animal = ネコ
関数呼び出し後: animal = ネコ

この例では、change_animal関数内でglobal animalと宣言しています。そのため、関数内でanimalに"ネコ"を代入すると、ローカル変数ではなくグローバル変数が書き換えられます。結果として、関数の呼び出し前後でグローバル変数animalの値が"イヌ"から"ネコ"に変わっています。

次に、globalキーワードを使わなかった場合(エラーになる例)と、使った場合を比較します。

count = 10 def without_global(): # globalキーワードなし # これはエラーになります try: count += 5 # UnboundLocalError print(f"カウント: {count}") except UnboundLocalError as e: print(f"エラー: {e}") def with_global(): # globalキーワード使用 global count count += 5 print(f"カウント: {count}") without_global() with_global() print(f"最終カウント: {count}")

出力結果

エラー: local variable 'count' referenced before assignment
カウント: 15
最終カウント: 15

この例では、globalを使わないwithout_global関数がエラー(UnboundLocalError)になっています。count += 5が実行される際、Pythonはcountをローカル変数だと判断します。しかし、代入される前にcountの値を参照しようとするため、エラーが発生します。

一方、with_global関数ではglobal countが宣言されているため、グローバル変数のcountが正しく更新されます。

実用例

Pythonのglobalキーワードの実用例をいくつか見ていきましょう。適切な使用例と具体的なコードを通して、実際の開発でどのように活用できるかを理解していきます。

グローバル変数の基本的な使い方

最もシンプルなグローバル変数の使用例です。アプリケーション全体で共有する設定値などに役立ちます。

zoo_name = "ハッピーアニマルパーク" def add_animal(animal_name): global zoo_name print(f"{animal_name}を{zoo_name}に追加しました") # ここでzoo_nameを変更 zoo_name = "ワンダフルアニマルパーク" add_animal("キリン") print(f"動物園の新しい名前: {zoo_name}")

出力結果

キリンをハッピーアニマルパークに追加しました
動物園の新しい名前: ワンダフルアニマルパーク

この例では、add_animal関数内でglobal zoo_nameを宣言し、グローバル変数zoo_nameの値を"ワンダフルアニマルパーク"に書き換えています。関数が実行されるとグローバル変数の値が変更されるため、関数呼び出し後のprint文では新しい名前が出力されます。

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

globalキーワードは、カンマ(,)で区切ることで、複数の変数を一度に宣言できます。

cat_count = 5 dog_count = 3 def update_counts(): global cat_count, dog_count cat_count += 2 dog_count += 4 print(f"更新後: ネコ {cat_count}匹, イヌ {dog_count}匹") print(f"更新前: ネコ {cat_count}匹, イヌ {dog_count}匹") update_counts()

出力結果

更新前: ネコ 5匹, イヌ 3匹
更新後: ネコ 7匹, イヌ 7匹

この例では、関数内で2つのグローバル変数を宣言しています。そのため関数内でcat_countとdog_countの両方のグローバル変数を変更できるようになり、それぞれの値が更新されています。

関数間でデータを共有する方法

複数の関数間でデータを共有する場合にグローバル変数が役立ちます。

animals = [] def add_animal(animal): global animals animals.append(animal) print(f"{animal}を追加しました") def show_animals(): print(f"現在の動物リスト: {', '.join(animals)}") add_animal("ライオン") add_animal("ゾウ") show_animals()

出力結果

ライオンを追加しました
ゾウを追加しました
現在の動物リスト: ライオン, ゾウ

この例では、グローバル変数animals(リスト)を複数の関数で共有しています。add_animal関数はglobal animalsと宣言し、appendメソッドでリストに要素を追加します。show_animals関数は、グローバル変数animalsを(読み取りのみなので宣言なしで)参照し、現在のリストの内容を表示しています。

モジュールレベルの設定値管理

アプリケーション全体で使う設定値(デバッグモードや最大値)をグローバル変数で管理する例です。

DEBUG_MODE = False MAX_ANIMALS = 10 def toggle_debug_mode(): global DEBUG_MODE DEBUG_MODE = not DEBUG_MODE print(f"デバッグモード: {'オン' if DEBUG_MODE else 'オフ'}") def set_max_animals(count): global MAX_ANIMALS MAX_ANIMALS = count print(f"最大動物数を{count}に設定しました") toggle_debug_mode() set_max_animals(15) print(f"設定値: デバッグ={DEBUG_MODE}, 最大数={MAX_ANIMALS}")

出力結果

デバッグモード: オン
最大動物数を15に設定しました
設定値: デバッグ=True, 最大数=15

この例では、DEBUG_MODEとMAX_ANIMALSという2つのグローバル変数を設定値として使っています。

ちなみに、プログラムの実行中に変更しない定数や、アプリケーション全体で共有する設定値を表す変数は、慣習としてすべて大文字(UPPER_CASE)で記述します。DEBUG_MODEやMAX_ANIMALSが該当するため、大文字で定義されています。

toggle_debug_mode関数とset_max_animals関数は、それぞれglobal宣言を使って、対応するグローバル変数の値を変更しています。

カウンター変数としての活用法

関数が呼び出された回数を追跡するようなカウンターにグローバル変数が利用できます。

call_count = 0 def count_animals(animals): global call_count call_count += 1 print(f"関数呼び出し {call_count}回目: {len(animals)}匹の動物") return len(animals) count_animals(["ネコ", "イヌ", "ウサギ"]) count_animals(["キツネ", "タヌキ"]) count_animals(["パンダ"])

出力結果

関数呼び出し 1回目: 3匹の動物
関数呼び出し 2回目: 2匹の動物
関数呼び出し 3回目: 1匹の動物

この例では、count_animals関数が呼び出されるたびに、global call_count宣言を使ってグローバル変数call_countの値を1増やしています。そのため関数が実行された合計回数を記録できています。

オブジェクト参照の変更

リストや辞書などの中身を変更するのではなく、変数が入っているオブジェクト自体を全く新しいものに置き換える場合にもglobalキーワードが必要です。

zoo = {"動物園名": "サファリパーク", "動物": ["ライオン", "キリン"]} def reset_zoo(): global zoo # 新しい辞書オブジェクトへの参照に変更 zoo = {"動物園名": "ペットショップ", "動物": ["ハムスター"]} print(f"変更前: {zoo}") reset_zoo() print(f"変更後: {zoo}")

出力結果

変更前: {'動物園名': 'サファリパーク', '動物': ['ライオン', 'キリン']}
変更後: {'動物園名': 'ペットショップ', '動物': ['ハムスター']}

この例では、reset_zoo関数がglobal zooを宣言し、グローバル変数zooに全く新しい辞書を代入しています。もしglobal宣言がないと、zooは新しいローカル変数とみなされ、グローバル変数の値は変更されません。

エラー回避のためのglobal使用法

+=や-=のような複合代入演算子をグローバル変数に対して使おうとすると、global宣言がない場合にエラー(UnboundLocalError)となります。

ここでは、エラーになる例と、globalを使って正しく回避する例を紹介します。

animal_type_error = "ほ乳類" animal_type_correct = "ほ乳類" def update_animal_info_error(): # globalを使わないとエラーになる例 try: # これは UnboundLocalError になります animal_type_error += " (温血動物)" print(f"エラー関数内: {animal_type_error}") except UnboundLocalError as e: print(f"エラー発生: {e}") def update_animal_info_correct(): # globalを使って正しく更新する例 global animal_type_correct animal_type_correct += " (温血動物)" print(f"正常関数内: {animal_type_correct}") # エラーになる関数を呼び出し print("---エラーになる例---") update_animal_info_error() print(f"エラー関数の実行後: {animal_type_error}") # グローバル変数は変更されていない print("---正常に動作する例---") # 正常に動作する関数を呼び出し update_animal_info_correct() print(f"正常関数の実行後: {animal_type_correct}") # グローバル変数が変更されている

出力結果

---エラーになる例---
エラー発生: cannot access local variable 'animal_type_error' where it is not associated with a value
エラー関数の実行後: ほ乳類
---正常に動作する例---
正常関数内: ほ乳類 (温血動物)
正常関数の実行後: ほ乳類 (温血動物)

この例では、global宣言を使わなかったupdate_animal_info_error関数がエラーになっています。

Pythonは関数内で変数への代入(=や+=など)が行われると、その変数をローカル変数だと判断します。そのため、global宣言がないと、ローカル変数のanimal_type_errorに値を代入しようとします。

しかし、代入するためには、まず右側のanimal_type_errorの値を参照する必要があります。この時点でローカル変数animal_type_errorはまだ作られていないため、「代入される前に参照された」というエラー(UnboundLocalError)が発生するのです。

一方、update_animal_info_correct関数ではglobal animal_type_correctとして宣言しています。animal_type_correctをグローバル変数として扱うため、正しく値を参照して追加でき、関数の外の値も更新されています。

デバッグ用途での活用例

デバッグ情報を収集するためのグローバル変数の活用例です。

debug_info = [] def process_animal(animal): global debug_info debug_info.append(f"{animal}の処理を開始: {get_time()}") # 何らかの処理 print(f"{animal}を処理しています...") debug_info.append(f"{animal}の処理が完了: {get_time()}") def get_time(): # 簡易的な時間表現 return "12:34:56" process_animal("トラ") print("デバッグ情報:") for info in debug_info: print(f"- {info}")

出力結果

トラを処理しています...
デバッグ情報:
- トラの処理を開始: 12:34:56
- トラの処理が完了: 12:34:56

この例では、process_animal関数が実行されるたびに、global debug_infoを使ってグローバル変数のリストdebug_infoに処理の記録を追加しています。プログラムの実行後、debug_infoの中身を見ることで、処理の流れを追いやすくなります。

まとめ

Pythonのglobalキーワードについて、基本から実践的な使い方まで解説しました。globalキーワードを使うと、関数内からグローバル変数を変更できるようになります。

globalが活躍する場面

  • アプリケーション全体で共有する設定値の管理
  • 複数の関数間でのデータ共有
  • カウンターやステート(状態)管理

重要なポイント

  • 関数内でグローバル変数を変更する場合はglobal宣言が必要
  • オブジェクト内のデータ変更はglobal宣言なしでも可能
  • 過度な使用は可読性とメンテナンス性を低下させる恐れがある

globalキーワードは便利ですが、グローバル変数の過剰な使用はコードの可読性や保守性を低下させる原因にもなります。

初めてPythonを学ぶ方も、紹介したglobalキーワードを実際に書いて、基本的な使い方を試してみてください。

ぜひglobalキーワードをマスターして、より複雑で実用的なプログラムを作成できるようになりましょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. Pythonのリファレンス記事一覧
  4. Python globalの使い方