Matlabで「clear」に似たものを探しています。ワークスペースからすべての変数を削除し、システムメモリから解放するコマンド/関数です。Pythonにそのようなものはありますか?
編集:ある時点ですべての変数をクリアするスクリプトを書きたいと思います。
Matlabで「clear」に似たものを探しています。ワークスペースからすべての変数を削除し、システムメモリから解放するコマンド/関数です。Pythonにそのようなものはありますか?
編集:ある時点ですべての変数をクリアするスクリプトを書きたいと思います。
delになる場合は、完了したらそれらを使用できます。名前空間が乱雑になっていることを単に心配している場合は、非常に多くの名前を使用して設計を再検討する必要があります。たとえば、一連の画像変換の場合、すべての中間ステップを維持する必要はない可能性があります。
回答:
次の一連のコマンドは、現在のモジュールからすべての名前を削除します。
>>> 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毎回句で再バインドされるため)、_たとえば、その制御変数に名前を付けて、「特別」(さらに、対話型インタープリターで_は、プロンプトで完全な式が入力されるたびに、名前がその式の値に再バインドされるため、長く続くことはありません;-)。
あなたは正確に何を決定した後はとにかく、され、あなたがやりたい、それが(目的関数を定義して、起動ファイル(あなたが唯一の対話型セッションでそれをしたい場合)、またはサイトカスタマイズファイルにそれを置くことは難しいことではありませんすべてのスクリプトで必要な場合)。
int = (2).__class__、str = ''.__class__、True = (1 == 1)...など
for n in dir(): ... if n[0]!='_': delattr(this, n)ました。ある時点で使用しn=this、ループで削除した場合です。したがって、次の反復では、delattr(this,n)削除したばかりであるため、試行中にエラーが発生します。:)したがって、正しく機能しません
いいえ、インタープリターを再起動することをお勧めします
IPythonは、バンドルされたインタープリターの優れた代替品であり、%reset通常は機能するコマンドを備えています
ctrl-d、その後pyt- >tabインタプリタに戻ろうとし。ここで特別なことをする理由はありません。
%reset -f非対話型であるために使用します。stackoverflow.com/questions/38798181/…–
from IPython import get_ipython;
get_ipython().magic('reset -sf')
%reset -sf
これはアレックスの答えの修正版です。モジュールの名前空間の状態を保存し、次の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のように機能します。
names = list(sys.modules[__name__].__dict__.keys())、restoreContextを微調整する必要があると思います。そうしないと、Pythonは、dict_keysオブジェクトを反復処理しているときに辞書のサイズを変更したと文句を言います。
importこの回答が必要な場合(つまり、これを保存し、Jupyterノートブックからインポートして、宿題のさまざまな問題間の名前空間をクリアします)、の"__main__"代わりに使用することをお勧めします__name__。
このglobals()関数は辞書を返します。ここで、キーは名前を付けることができるオブジェクトの名前です(ちなみに、値idはこれらのオブジェクトの名前です)。exec()関数は文字列を受け取り、Pythonコンソールに入力するかのように実行します。したがって、コードは
for i in list(globals().keys()):
if(i[0] != '_'):
exec('del {}'.format(i))