ローカル変数とグローバル変数
これまで使用した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) # 関数の外側の値が変更されている
上のサンプルではグローバル変数が更新されていることが確認できます。