global宣言

ローカル変数とグローバル変数

これまで使用したPythonの変数の宣言箇所は大別すると以下の通り関数内外の2通りがあります。

  • 関数の外側
  • 関数の内側
x = 100

def func():
    y = "sample"
    print(y)

上の例でいうとxは関数の外側、yは関数の内側で定義されています。関数の外側で定義した変数をモジュール変数若しくはグローバル変数と呼びます。(「グローバル変数」という名称には議論があるのですが、本稿では以降グローバル変数という用語を使用します。)一方、関数の内側で定義した変数をローカル変数と呼びます。ローカル変数は関数内部でのみ有効となります。つまり、ある関数から別の関数のローカル変数は参照することができません。一方で、グローバル変数は他の関数からも参照したり更新することが可能です。

グローバル変数の参照

関数の内部からグローバル変数の値を読み取る場合、特に何かをせず可能です。以下のサンプルではグローバル変数xを関数sample_function内部で読み取っています。

x = 100
def sample_function():
    print(x) # 100が出力される

sample_function()

実行すると変数xの値が出力されることが確認できます。

グローバル変数の更新

また、関数の内部でグローバル変数に代入した場合、ローカル変数の定義として扱われてしまいます。この場合、グローバル変数は変更されません。

x = 100
def sample_function():
    x = 200
    print(x) # 200が出力される

sample_function() # 関数内部でxの値を変更
print(x) # 100が出力される。つまり、関数の外側の値は変更されない

上のサンプルを実行すると、代入すると新たなローカル変数が生成され、グローバル変数に代入できないことが確認できます。では、グローバル変数を更新する場合はどうすればよいでしょうか?これは、global宣言を記述することで解決します。

x = 100
def sample_function():
    global x # global宣言 xはglobal変数であることを明示する
    x = 200
    print(x)

sample_function() # 関数内部でxの値を変更
print(x) # 関数の外側の値が変更されている

上のサンプルではグローバル変数が更新されていることが確認できます。