Python でグローバル変数を使用する方法 (グローバル キーワード)

Python でグローバル変数がどのように機能するかを学びます。変数のスコープ、ローカル名前空間とグローバル名前空間、および global キーワードを使用して変数を変更する方法を理解します。

エディターでこのソリューションを試してください

概要

名前空間と変数のスコープを理解することは、Python でバグのないソフトウェアを作成するために重要です。スコープは、プログラムのどの部分が変数にアクセスまたは変更できるかを決定します。すべての関数の外で宣言された変数はグローバル スコープに存在し、モジュール内のどこからでも読み取ることができます。

ただし、関数がグローバル変数を変更 (再割り当て) しようとすると、問題が発生します。デフォルトでは、Python は関数内の代入を認識すると、変数が関数に対してローカルであると想定します。グローバルとして宣言せずにグローバル変数を変更しようとすると、Python は同じ名前のローカル変数を作成し、グローバル変数は変更されないままになります (または「UnboundLocalError」が発生します)。

ローカルの名前空間を作成するのではなく、グローバル名前空間の変数を変更することを Python に明示的に伝えるには、関数内で `global` キーワードを使用して変数を宣言する必要があります。グローバル変数の使用が必要な場合もありますが、状態の追跡やデバッグが困難になるため、大規模なソフトウェア設計では一般的に悪い習慣であると考えられています。

コードと実行の出力

このスクリプトは、グローバル変数の読み取り、変数シャドウイング トラップ、および global キーワードを使用したグローバル変数の変更を示します。

counter = 10 # Global variable

def read_counter():
    # Reading a global variable works out-of-the-box
    print("Reading global counter:", counter)

def shadow_counter():
    # Attempting to assign without 'global' creates a local variable
    counter = 20 # Shadowing
    print("Inside shadow function:", counter)

def modify_counter():
    global counter # Declaring we are writing to global scope
    counter = 50
    print("Inside modify function:", counter)

read_counter()
shadow_counter()
print("Counter after shadow function:", counter) # Remains 10

modify_counter()
print("Counter after modify function:", counter) # Now 50
端子出力
Reading global counter: 10
Inside shadow function: 20
Counter after shadow function: 10
Inside modify function: 50
Counter after modify function: 50

段階的な実装

  • 関数のスコープ外でグローバルにアクセスする必要がある変数を宣言します。
  • 特別な宣言を追加せずに、関数内のグローバル変数を読み取ります。
  • グローバル変数値を変更する必要がある場合は、関数内でグローバル キーワード (グローバル カウンタなど) を使用します。
  • スコープの混乱や名前空間の汚染を防ぐために、グローバル変数の使用を制限します。

よくある質問

Python の変数シャドウイングとは何ですか?

シャドウイングは、ローカル スコープ内で宣言された変数 (関数など) が外側のグローバル スコープ内の変数と同じ名前を持つ場合に発生します。ローカル変数はグローバル変数をマスクし、そのスコープ内で一時的にアクセスできなくなります。

グローバル キーワードと非ローカル キーワードの違いは何ですか?

global は、最も外側のモジュール スコープで定義された変数にアクセスするために使用されます。 nonlocal は、入れ子になった関数内で、外側の (外側の) 関数スコープで定義された変数にアクセスするために使用されます。

関連トピック

推奨される Python リソース

関連するインタラクティブなチュートリアル、チートシート、コード比較で知識を深めてください。