Pythonでコードを書くときに、変数がグローバルなものかローカルなものかを考えながらプログラミングしていますか?
Pythonでは変数の扱いについて気をつけることは少ないのですが、関数の外で宣言された変数か、関数の内側で宣言された関数かどうかはとても重要な要素の一つです。
グローバル変数を書き換える方法について知りたい
といった方に向けて、この記事では以下の内容について解説していきます。
- 【基礎】グローバル変数とローカル変数の違い
- 【基礎】変数のスコープとは
- 【基礎】グローバル変数、ローカル変数の例
- 【発展】関数の中からグローバル変数を書き換える方法
グローバル変数はPythonの基礎的な部分になるので今一度学び直したという方も、ぜひ最後までご覧ください!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
グローバル変数とは
グローバル変数はどの範囲からもアクセスできる変数で、一番自由度の高い変数とも言えます。グローバル変数について理解するには、変数のスコープについて知っておく必要があります。
スコープとは、変数がアクセスできる範囲のことを言います。変数はコードのどこに書いてもアクセスできるというわけではなく、グローバル変数かローカル変数かのどちらかに分けられます。
例えば関数の中で宣言された変数か外で宣言された変数かによって動き方が変わっていきます。
それではそのグローバル変数とローカル変数について見ていきましょう。
グローバル変数の使い方
グローバル変数はどの範囲からもアクセスできる変数で一番自由度の高い変数とも言えます。
こちらのコードをご覧ください。
gvar = 'abcdefg' def gfunc(): print(gvar) gfunc() print(gvar)
実行結果
abcdefg # gfunc関数での表示 abcdefg # print関数での表示
ここではgfunc関数の外にgvar変数を宣言して値を代入しています。
このように、gfunc関数の外で宣言されたgvar変数は、gfunc関数の中でも表示(参照)させることができました。
このような変数をグローバル変数といいます。
ローカル変数の使い方
次にローカル変数についておさらいしておきましょう。
ローカル変数はグローバル変数と違ってアクセスできる範囲が変わってきます。
こちらのコードをご覧ください。
def lfunc(): lvar = 'abcdefg' print(lvar) lfunc() print(lvar)
実行結果
abcdefg # lfunc関数での表示 (エラー) # print関数での表示
このようにlfunc関数の中で宣言した変数は、lfunc関数の外側ではprint関数で表示(参照)させることができませんでした。
このような変数をローカル変数といいます。
次はこのようなグローバル変数とローカル変数をもっと扱いやすくする方法について学んでいきましょう。
関数の中からグローバル変数を書き換える方法
先程はグローバル変数を関数の中で表示(参照)させることができました。
しかし、このグローバル変数を書き換える(再代入)のは通常の方法ではうまくはいきません。
こちらのコードをご覧ください。
gvar = 'abcdefg' def testfunc(): gvar = '0123456' print(gvar) print(gvar) testfunc() print(gvar)
実行結果
abcdefg # print関数での表示 0123456 # testfunc関数での表示 abcdefg # print関数での表示
一見すると書き換わったようにも見えますが、testfunc関数が実行されたあともグローバル変数で代入した値がそのまま表示されました。
これではグローバル変数が書き換わっていません。これを直すにはglobal宣言を使います。
こちらのコードをご覧ください。
gvar = 'abcdefg' def testfunc(): global gvar gvar = '0123456' print(gvar) print(gvar) testfunc() print(gvar)
実行結果
abcdefg # print関数での表示 0123456 # testfunc関数での表示 0123456 # print関数での表示
先ほどとは変わって、testfunc関数が実行されたあとも再代入した値が表示されていますね。
まとめ
この記事ではグローバル変数について、以下の内容を解説しました。
- 変数のスコープとは
- グローバル変数とローカル変数の違い
- グローバル変数、ローカル変数の例
- 関数の中からグローバル変数を書き換える方法
普段はあまり気にかけず、すべての変数をグローバル変数にしていた人もいるかもしれませんが、使い分けることでより目的がはっきりとしたコードを書けるようになります。
また関数とこれらの変数が絡んでくると少々ややこしいのですが、global宣言の使い所をしっかりとおさえておけば問題は無いでしょう。
もし変数についてわからなくなった方は、ぜひまたこの記事をご覧ください。