追記2
コメントで@shiracamusさんが綺麗なコードを書いてくださいました。
この記事の内容は全部これでOKそうです。
def hoge():
globals()['a'] = 1
hoge()
print(a)
OK
def hoge():
# execで定義した変数は、第3引数のdictに格納されるみたいなので、現在のグローバル変数(globals())を指定
# 第2引数には、とりあえず {} を入れておく
exec('a=1', locals(), globals())
hoge()
a
output
1
NG
def hoge():
global a
exec('a=1')
hoge()
a
output
NameError: name 'a' is not defined
追記1
exec の第1引数の中で関数内で定義された辞書を使う方法。色々試したら出来たので、結果だけ。
ポイント:
・グローバル変数に同名の変数があるとそちらが参照されるので、被らないような変数名に置き換えてから実行する。
・第2引数にlocals()
を指定する。(これをしないと、NameError: name 'fagragfaa' is not defined
になる。)
def hoge():
dic = {'a': 1, 'b': 2}
for key in dic:
# グローバル変数の dic と被らないように、変数名を変える
fagragfaa = dic
exec(f'{key} = fagragfaa["{key}"]', locals(), globals())
dic = {}
hoge()
a, b
output
(1, 2)