Python

【Python】グローバル変数が更新されない時の対処法

投稿日:2021年4月20日 更新日:

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 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

現役シリコンバレーエンジニアが教えるPython入門!応用では、データ解析、データーベース、ネットワーク、暗号化、並列化、テスト、インフラ自動化、キューイングシステム、非同期処理など盛り沢山の内容です!

ベネッセが運営する動画学習サイトUdemyで視聴することができる動画教材です。
(セールの時には¥1,500程度で買えます!)

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

エキスパートPythonプログラミング改訂2版 Pythonプログラミングのベストプラクティスを伝授

本書は、Pythonを使って仕事をしている開発者が普段どのようなツールやテクニックを用いて仕事をしているのか、また開発者が実際に現場で用いているベストプラクティスについて解説した書籍です。本書を読むことで、先進的なPythonプログラマが日常的に使用している開発ノウハウを学ぶことができます。

より実務に近いノウハウが盛りだくさんの書籍です。
Pythonエンジニアを目指す方は持っておいて損はないと思います。

-Python
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【Kivy】AttributeError: ‘ROOT’ object has no attribute ‘_disabled_count’の対処法【Python】

Kivyでのアプリ開発をしていると、このようなエラーに出くわすことがあります。こちらのエラー対処法を紹介します。 結論:Widgetを定義したクラスのコンストラクタを修正 この場合は、kvファイルでは …

【Kivy入門】Button押下で動作するアプリの作り方【Python】

Kivyを使った簡単なGUIアプリケーションを作成します。無理のない情報量で、適宜解説をしていますので、Kivyでアプリを作ってみようかな!と考えている方は、参考にしていただけると嬉しいです。(Kiv …

【Kivy】ボタンのフィードバックと重い処理を分ける方法【Python】

Kivyでアプリ開発をしていると、MVCのように処理と表示を分けたくなることがあると思います。その時、ボタンをトリガーにすると、ボタンのフィードバックのタイミングが処理の終了タイミングと同じになってし …

【Python】マルチスレッドの使い方【Thread】

Pythonには、マルチスレッドと呼ばれるテクニックがあります。一般的にプログラム言語は上から下に順番に1行ずつ実行されるものです。Pythonでは、それをスレッドとして複数同時に取り扱うことが可能で …

【Python】pytestの使い方【テスト駆動開発】

今回は、テスト駆動開発の足掛けとして、pytestの使い方を紹介します。 テスト駆動開発とは、テストのことを第一に考えて実装する開発法のことです。アジャイル開発のように、設計・開発・テストを短く繰り返 …

yassanさんのプロフィール写真

yassan
インフラエンジニア。
独学でインフラ・クラウドについて学んでいます。
大阪 / 20代後半 / 決闘者 / FE / AWS-SAA

twitter: @yassan10787859