<目次>
Pythonで動的に変数を定義する方法
想定利用シーン
(構文1)forループから
(構文2)ディクショナリー形式から
サンプルプログラム1
サンプルプログラム2
Pythonで動的に変数を定義する方法
想定利用シーン
Pythonで例えば「決められたサイズの数だけ、forループで動的に変数を定義したい」という場面があるかもしれません。本記事ではその方法をご紹介します。
(例)想定利用シーン
・ディープラーニングで層の数だけ、モデル変数を定義したい場合など
・指定した規模の数だけ、動的に変数を定義したい場合など
(構文1)forループから
globals()関数にて動的に「変数、値」のペアを生成し、ディクショナリー型で返却します。
下記の例では「var_1~var_9」までを動的に作っています。
# forループで変数を「動的に」生成
for i in range(1, 10):
globals()[f"var_{i}"] = i
(適する場面)
もし、事前に変数の名前のディクショナリーが無く、単に「指定した規模で動的に作る」といった仕様の場合はこちらの(構文1)が適切かもしれません。
(構文2)ディクショナリー形式から
forでディクショナリーの「key、value」のペアをループし、execで動的に「変数、値」のセットに変換しています。
下記の例では「a1、a3、c2」を動的に作っています。
# JSONデータ
update = {"a1": 1000, "a3": 3500, "c2": 5500}
# execで各[key-value]を[変数-値]に変換
for key, val in update.items():
exec(f"{key} = {val}")
(適する場面)
あらかじめ、作成内容がディクショナリーで連携可能な場合は、こちらの(構文2)の方がスムーズかもしれません。
サンプルプログラム1
上記の(構文1)を使ったサンプルプログラムです。
def main():
# 標準では、隠し変数が定義されている
print({k: v for k, v in globals().items() if not k.startswith("__")})
# forループで変数を「動的に」生成
for i in range(1, 10):
globals()[f"var_{i}"] = i
# 変数をコンソール表示
print()
print({k: v for k, v in globals().items() if not k.startswith("__")})
if __name__ == "__main__":
main()
【サンプルプログラム1】の出力結果:
{'main': <function main at 0x000002CAD5047040>}
{'main': <function main at 0x000002CAD5047040>, 'var_1': 1, 'var_2': 2, 'var_3': 3, 'var_4': 4, 'var_5': 5, 'var_6': 6, 'var_7': 7, 'var_8': 8, 'var_9': 9}
(図131)

globals()関数の解説
globals()はPythonにおけるグローバルシンボルテーブルの情報(≒グローバルスコープでの変数名、変数値など)を保持しているテーブルにアクセスするための関数です。
グローバルシンボルテーブルの内容をディクショナリー形式で返却してくれます。
例えば、ファイル名などもグローバルシンボルテーブルに含まれます。
x = globals() print(x["__file__"])
サンプルプログラム2
上記の(構文2)を使ったサンプルプログラムです。
if __name__ == "__main__":
# JSONデータ
update = {"a1": 1000, "a3": 3500, "c2": 5500}
# execで各[key-value]を[変数-値]に変換
for key, val in update.items():
exec(f"{key} = {val}")
print(a1, a3, c2)
【サンプルプログラム2】の出力結果:
1000 3500 5500
(図132)
