私はMatlabの「クリア」に似たものを探しています:ワークスペースからすべての変数を削除し、システムメモリからそれらを解放するコマンド/関数。 Pythonにはそのようなことがありますか?
編集:ある時点ですべての変数をクリアするスクリプトを書きたいです。
次の一連のコマンドは、現在のモジュールからevery nameを削除します。
>>> import sys
>>> sys.modules[__name__].__dict__.clear()
「すべての名前」にはすべてのビルトインが含まれているため、実際にこれを実行したいとは思わないので、そのような完全な消去後にできることはあまりありません。覚えておいてください、Pythonには「変数」のようなものは実際にはありません-オブジェクトがあり、多くの種類(モジュール、関数、クラス、数字、文字列、...)、およびオブジェクトにバインドされたnamesがあります。シーケンスが行うことは、モジュールからすべての名前を削除することです(対応するオブジェクトは、それらへのすべての参照が削除された場合にのみ消えます)。
より選択的になりたいかもしれませんが、より具体的になりたい場合を除いて、あなたが何を意味するかを正確に推測することは困難です。ただし、例を挙げます。
>>> import sys
>>> this = sys.modules[__name__]
>>> for n in dir():
... if n[0]!='_': delattr(this, n)
...
>>>
このシーケンスは、すべての組み込みの名前を収容する__builtins__
特殊名を含む、プライベートまたは魔法の名前のみを残します。そのため、ビルトインは引き続き機能します-例えば:
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n']
>>>
ご覧のとおり、名前n
(そのfor
内の制御変数)もたまたま(for
句で毎回再バインドされるため)制御変数_
に名前を付ける方がよい場合があります。たとえば、「特別だ」を明確に表示するために(さらに、対話型インタープリターでは、名前に_
がプロンプトで入力されるたびに、その式の値に再バインドされるので、長い間固執する;-)。
とにかく、やりたいことを正確に決定したら、目的の関数を定義して開始するのは難しくありません。ファイル(インタラクティブセッションでのみ必要な場合)またはサイトカスタマイズファイル(すべてのスクリプトで必要な場合)。
いいえ、通訳を再起動するのが最善です
Ipython は、バンドルされたインタープリターの優れた代替品であり、通常機能する%reset
コマンドがあります
関数を記述すると、関数を残すと内部の名前がすべて消えます。
この概念は namespace と呼ばれ、非常に優れているため、 Zen of Python になりました。
名前空間は素晴らしいアイデアの1つです。それらをもっとやってみましょう。
同様に、IPythonの名前空間は、マジックコマンド%reset -f
でリセットできます。 (-f
は「強制」を意味します。つまり、「すべての変数を本当に削除したいかどうかは聞かないでください。」)
from IPython import get_ipython;
get_ipython().magic('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()を呼び出す前に「clear = restoreContext」という行を追加して、matlabのclearのように機能させることもできます。
Spyderでは、各PythonファイルのIPythonコンソールを設定して、メニューRun -> Configuration -> General settings -> Remove all variables before execution
で実行する前にすべての変数をクリアできます。
globals()
関数はディクショナリを返します。キーは名前を付けられるオブジェクトの名前です(そして、値はこれらのオブジェクトのid
sです)exec()
関数は文字列を取り、実行しますpythonコンソールに入力するかのように、コードは
for i in list(globals().keys()):
exec('del {}'.format(i)) if i[0] != '_' else None
ここで、python構文に従うためにelse None
が追加されています。このコードは見栄えがよくありませんが、短いです。より良い書き方は
for i in list(globals().keys()):
if(i[0] != '_'):
exec('del {}'.format(i))
アイドルIDEには、シェル/再起動シェルがあります。 Cntrl-F6がそれを行います。