Tak's Notebook

Kaggle, Machine Learning, Engineering

関数内でグローバル変数を削除したい場合は `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 がグローバル変数から削除された。

次回は、関数の中で呼び出した関数内で、呼び出し元の関数の変数を削除したい場合についての記事を書く。