2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[python] 関数内でexecを使ってglobal変数を定義する方法

Last updated at Posted at 2021-05-11

追記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)
2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?