関数内でグローバル変数を削除したい場合は `del globals()["x"]` としないとダメ
関数内でグローバル変数を削除したい場合
関数内でグローバル変数を削除したい場合、 del globals()["x"]
としないとダメという話。
メモリ節約の際などに使えるかもしれない。
グローバル変数
ある変数を定義すると、 globals()
に辞書型で登録される。
>>> x = 1 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'x': 1}
ローカル変数
関数内で定義された変数は globals()
には登録されない。
また、関数内で del
しても、ローカル変数を削除するだけで、グローバルには影響を与えない。
>>> def func(x): ... y = x * 2 ... del x ... return y ... >>> func(x) 2 >>> x 1 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'x': 1, 'func': <function func at 0x7ff6c81d2048>}
関数内でグローバル変数を削除したい場合、 del globals()["x"]
のようにする
del globals()["x"]
で関数内でグローバル変数を削除できる。
>>> def func2(x): ... y = x * 2 ... del globals()["x"] ... return y ... >>> func2(x) 2 >>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'func': <function func at 0x7ff6c81d2048>, 'func2': <function func2 at 0x7ff6c81d20d0>}
無事 x がグローバル変数から削除された。
次回は、関数の中で呼び出した関数内で、呼び出し元の関数の変数を削除したい場合についての記事を書く。