Pythonスクリプトの途中ですべての変数をクリアするにはどうすればよいですか?


84

Matlabで「clear」に似たものを探しています。ワークスペースからすべての変数を削除し、システムメモリから解放するコマンド/関数です。Pythonにそのようなものはありますか?

編集:ある時点ですべての変数をクリアするスクリプトを書きたいと思います。


2
タイトルを「Pythonスクリプトの途中ですべての変数をクリアするにはどうすればよいですか?」のように変更すると便利です。「Pythonでコマンドウィンドウを再起動する方法」のため、このトピックに関する今後の検索のために あなたが実際に求めていることとは何の関係もありません。
サム・ドーラン

これが理にかなっている可能性のあるコンテキストを提供できますか?
S.Lott 2010

2
コーディングの習慣をネイティブ環境から意味のない環境に移そうとする別のケースのように聞こえます。
グレンメイナード

いくつかの巨大なオブジェクト(画像または他の巨大な配列)だけが気delになる場合は、完了したらそれらを使用できます。名前空間が乱雑になっていることを単に心配している場合は、非常に多くの名前を使用して設計を再検討する必要があります。たとえば、一連の画像変換の場合、すべての中間ステップを維持する必要はない可能性があります。
ニックT

3
@ S.Lott:コンソールでの探索的科学分析。多くの不要な変数が発生するのはよくあることです(物事を試した後、それが適切な経路ではないと判断した後)。しかし、この場合、ジョン・ラルーイの答えが最も適切です。
naught101 2017年

回答:


69

次の一連のコマンドは、現在のモジュールからすべての名前を削除します。

>>> import sys
>>> sys.modules[__name__].__dict__.clear()

「すべての名前」にはすべての組み込みが含まれているため、実際にこれを実行したいとは思わないので、このような完全な消去後にできることはあまりありません。Pythonには、「変数」のようなものは実際にはありません。さまざまな種類のオブジェクト(モジュール、関数、クラス、数値、文字列など)があり、オブジェクトにバインドされた名前があります。シーケンスが行うことは、モジュールからすべての名前を削除することです(対応するオブジェクトは、それらへのすべての参照が削除された場合にのみ削除されます)。

より選択的にしたいと思うかもしれませんが、より具体的にしたいのでなければ、あなたが何を意味するのかを正確に推測するのは難しいです。しかし、例を挙げると、次のようになります。

>>> import sys
>>> this = sys.modules[__name__]
>>> for n in dir():
...   if n[0]!='_': delattr(this, n)
... 
>>>

このシーケンスでは、__builtins__すべての組み込み名を格納する特別な名前を含め、プライベートまたは魔法の名前だけが残ります。したがって、組み込みは引き続き機能します-例:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n']
>>> 

ご覧のとおり、name n(その中の制御変数for)もたまたま固執しているので(for毎回句で再バインドされるため)、_たとえば、その制御変数に名前を付けて、「特別」(さらに、対話型インタープリターで_は、プロンプトで完全な式が入力されるたびに、名前がその式の値に再バインドされるため、長く続くことはありません;-)。

あなたは正確に何を決定した後はとにかく、され、あなたがやりたい、それが(目的関数を定義して、起動ファイル(あなたが唯一の対話型セッションでそれをしたい場合)、またはサイトカスタマイズファイルにそれを置くことは難しいことではありませんすべてのスクリプトで必要な場合)。


2
起動時にいつでも元の辞書のコピーを保持してから、追加された名前を削除することができます;)しかし、これは動的システムの明らかな悪用であり、これを行うのに無意味な状況は考えられません。インチ
monoceres

5
ハハ、これは素晴らしいです...あなたのようなものを行うことによって取り戻すことができますどのくらいの機能あなたがこれを行うことによって失うどのくらいの機能驚か、まだだint = (2).__class__str = ''.__class__True = (1 == 1)...など
Chinmay Kanchi

@monoceres、そのコピーにどのように名前を付け、どこに隠して、それも消去されないようにしますか?-)
Alex Martelli 2010

2
Pythonを使用すればするほど、Pythonが大好きになります。それは素晴らしい言語であるだけでなく、単にそれをいじって、本当にしてはいけないことをさせるために何時間も費やすことができます;-)
Chinmay Kanchi 2010

1
間違った方法で入手したかもしれませんが、1つの問題に直面しfor n in dir(): ... if n[0]!='_': delattr(this, n)ました。ある時点で使用しn=this、ループで削除した場合です。したがって、次の反復では、delattr(this,n)削除したばかりであるため、試行中にエラーが発生します。:)したがって、正しく機能しません
Mikhail_Sam 2017年

60

いいえ、インタープリターを再起動することをお勧めします

IPythonは、バンドルされたインタープリターの優れた代替品であり、%reset通常は機能するコマンドを備えています


1
「いいえ」とは、私がそれをすべきではない、またはそれが不可能であることを意味しますか?あなたが私がそれをすべきではないと言うなら、あなたはその理由を説明できますか?
snakile 2010

6
1:それは私のための第二の四半期もかかりctrl-d、その後pyt- >tabインタプリタに戻ろうとし。ここで特別なことをする理由はありません。
サム・ドーラン

3
%resetはほとんどの変数で機能しますが、機能しない変数もあります。私にとっては、インタープリターを再起動するだけですべてがクリーンになることが保証されます。
artemis_clyde 2016年

3
%reset -f非対話型であるために使用します。stackoverflow.com/questions/38798181/…–
Joachim Wagner

27

関数を作成すると、関数を残すと、内部のすべての名前が消えます。

この概念は名前空間と呼ばれ、非常に優れているため、PythonZenになりました。

名前空間は素晴らしいアイデアの1つです。もっと多くのことをしましょう!

IPythonの名前空間も同様にmagicコマンドでリセットできます%reset -f。(-fつまり、「強制」を意味します。つまり、「本当にすべての変数を削除するかどうかを尋ねないでください。削除するだけです。」)


明らかなことを追加します。すべてをメイン関数(インポートを含む)内に配置すると、実際には、その関数を終了するだけでリセットできるワークプレイスが得られます。それがまさにその質問の意図したことだと思います。
デビッド

8
from IPython import get_ipython;   
get_ipython().magic('reset -sf')


1
あるいは単に%reset -sf
सत्यमेवजयते

1
実際、anacondaプロンプトを使用してPythonスクリプトを実行すると、%reset -sfコマンドが機能せず、エラーがスローされます(try-exceptを使用した場合でも、機能しません)。あなたは同じことを試みるかもしれません、そしてあなたは見るでしょう。ただし、ipythonライブラリを使用すると、考えられるすべての場合にこの問題が解決されます。
AnuragGupta19年

5

これはアレックスの答えの修正版です。モジュールの名前空間の状態を保存し、次の2つの方法を使用して復元できます...

__saved_context__ = {}

def saveContext():
    import sys
    __saved_context__.update(sys.modules[__name__].__dict__)

def restoreContext():
    import sys
    names = sys.modules[__name__].__dict__.keys()
    for n in names:
        if n not in __saved_context__:
            del sys.modules[__name__].__dict__[n]

saveContext()

hello = 'hi there'
print hello             # prints "hi there" on stdout

restoreContext()

print hello             # throws an exception

saveContext()を呼び出す前に「clear = restoreContext」という行を追加することもでき、clear()はmatlabのclearのように機能します。


1
素晴らしい答えです!Python 3の場合names = list(sys.modules[__name__].__dict__.keys())、restoreContextを微調整する必要があると思います。そうしないと、Pythonは、dict_keysオブジェクトを反復処理しているときに辞書のサイズを変更したと文句を言います。
Sam Bader

また、importこの回答が必要な場合(つまり、これを保存し、Jupyterノートブックからインポートして、宿題のさまざまな問題間の名前空間をクリアします)、の"__main__"代わりに使用することをお勧めします__name__
Sam Bader

3

Spyderでは、メニューで実行する前にすべての変数をクリアするように、PythonファイルごとにIPythonコンソールを構成できますRun -> Configuration -> General settings -> Remove all variables before execution


2

このglobals()関数は辞書を返します。ここで、キーは名前を付けることができるオブジェクトの名前です(ちなみに、値idはこれらのオブジェクトの名前です)。exec()関数は文字列を受け取り、Pythonコンソールに入力するかのように実行します。したがって、コードは

for i in list(globals().keys()):
    if(i[0] != '_'):
        exec('del {}'.format(i))

このコードスニペットは質問を解決する可能性がありますが、説明含めると応答の品質が向上します。あなたは将来読者のために質問に答えていることを忘れないでください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
ステファン・クレイン

ありがとうございました。今は良くなっていますか?
Kolay.Ne


0

必要なすべての変数を継続するクラスを作成する最も簡単な方法ではありませんか?次に、すべてのcurretn変数を含む1つのオブジェクトがあり、必要に応じてこの変数を上書きできますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.