Pythonでグローバル変数を取り扱っているとき、関数内でグローバル変数の値を更新しても、更新が反映されていないということはないでしょうか。
これには、Pythonのお作法が関わっています。
この解決法と、グローバル変数について解説します。
結論:関数内でglobalステートメントを記述する
例えば、以下のようなソースコードがあったとします。
a = 'before'
def update():
a = 'after'
# ここでの出力は'before'
print('a:', a)
update()
# ここでの出力はupdateを実行したので'after'
print('a:', a)
ソースコードの中のコメント通り、2回目の出力ではaの値がafterになっていることを期待します。
では、実行結果です。
a: before
a: before
というわけで、残念ながらbeforeのままでした。
そこで、プログラムの4行目にglobalステートメントを追記します。
a = 'before'
def update():
global a # ここに追加
a = 'after'
# ここでの出力は'before'
print('a:', a)
update()
# ここでの出力はupdateを実行したので'after'
print('a:', a)
実行結果は、下記の通りです。
a: before
a: after
ちゃんと2回目の出力結果がafterになりました!
補足
関数内ではグローバル変数と認識しない
Pythonの場合は、クラスや関数の外で宣言したものはグローバル変数となります。
これは、他の多くの言語と共通していることと思います。
加えてPythonの場合は、クラスや関数内でグローバル変数を利用する場合には、そこでこの変数はglobal変数だということを明記しないといけないです。
つまり、上記、main1.pyの場合では、global変数のaと、update関数内でのaは別物(ローカル変数a)として取り扱っているということです。
特にエラーが出るわけでもなく、気が付きにくいので注意しておきましょう。
Python学習におすすめの教材
Pythonについて、しっかりと基礎から学びたい、実践的なスキルを身につけたいと考えている方向けに、おすすめの学習教材を紹介します。
これらの教材は、実際に僕がPythonの学習に使った教材になっています。
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
現役シリコンバレーエンジニアが教えるPython入門!応用では、データ解析、データーベース、ネットワーク、暗号化、並列化、テスト、インフラ自動化、キューイングシステム、非同期処理など盛り沢山の内容です!
ベネッセが運営する動画学習サイトUdemyで視聴することができる動画教材です。
(セールの時には¥1,500程度で買えます!)
Pythonは自由度が高くて雑に書いても動きますが、その分コードスタイルがおろそかになりがちです。
正しいコードスタイルを身に着けておかなければ、Pythonプログラマとして活躍することはあり得ません。
この教材は、グローバルスタンダードなコードスタイルを正しく学びながら、アルゴリズムやサーバー構築など幅広くPythonの活用方法を学習することができます。
Pythonの学習で間違えたくない方や、趣味レベルのスキルから一歩抜け出したい方におすすめです。
エキスパートPythonプログラミング改訂2版 Pythonプログラミングのベストプラクティスを伝授
本書は、Pythonを使って仕事をしている開発者が普段どのようなツールやテクニックを用いて仕事をしているのか、また開発者が実際に現場で用いているベストプラクティスについて解説した書籍です。本書を読むことで、先進的なPythonプログラマが日常的に使用している開発ノウハウを学ぶことができます。
こちらの書籍は、様々なユースケースに対するベストプラクティスを学習することができる書籍です。
Python2系と3系の違いについてもよく取り上げられますので、実質どちらのバージョンにも対応しているといえます。
Pythonをうまく使いこなせていない気がする方、初心者の殻を破りたい方におすすめです。