1. ホーム
  2. python

[解決済み] 作成した変数や関数などをインタプリタのメモリから削除する方法はありますか?

2022-05-31 03:45:33

質問

この質問に対する正確な答えを数日前から探しているのですが、なかなか良いものが見つかりません。私はプログラミングの完全な初心者ではありませんが、まだ中級者レベルでもありません。

Pythonのシェルの中にいるとき、私はタイプします。 dir() と入力すると、現在のスコープ(メインブロック)にあるすべてのオブジェクトの名前が表示され、その数は6個です。

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

次に、変数を宣言するときに、例えば x = 10 と宣言すると、自動的に組み込みモジュールの下にあるオブジェクトのリストに dir() と入力すると dir() と入力すると、表示されるようになりました。

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

関数やクラスなども同様です。

最初にあった標準的な6つのオブジェクトを消さずに、これらの新しいオブジェクトをすべて削除するにはどうしたらよいでしょうか。

私はここで、コマンド プロンプト ウィンドウからすべてのテキストを消去する "memory cleaning" や "cleaning of the console" について読みました。

>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()

しかし、これらすべては私が達成しようとしていることとは何の関係もなく、使用されているすべてのオブジェクトをクリーンアップするわけではありません。

どのように解決するのですか?

個々の名前を削除するには del :

del x

から削除するか、あるいは globals() オブジェクトから削除することもできます。

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

これは単なるループの例です。これは、アンダースコアで始まらない名前のみを防御的に削除し、インタープリタではアンダースコアで始まらない名前のみを使用したと(無理もない)仮定します。本当に徹底したいのであれば、ハードコードされた名前のリスト(ホワイトリスト)を代わりに使用することができます。インタープリタを終了して再起動する以外に、あなたのためにクリアを行う組み込みの関数はありません。

インポートしたモジュール ( import os で参照されるため、インポートされたままとなります。 sys.modules によって参照されるため、インポートされたままになります。その後のインポートでは、すでにインポートされたモジュールオブジェクトが再利用されます。ただ、現在のグローバルな名前空間では、それらへの参照を持つことはありません。

しかし、Pythonはメモリ上のデータについてどんなセキュリティ保証もしません。オブジェクトがもはや参照されないとき、インタプリタはもはや使用されていないとしてメモリをマークしますが、データへのアクセスを防ぐためにそのメモリを上書きする措置を取りません。もしそのレベルのセキュリティ保護が必要であれば、セキュリティを考慮して自身のメモリを管理するサードパーティの拡張機能を使用する必要があります。