web-dev-qa-db-ja.com

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

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

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

65
snakile

次の一連のコマンドは、現在のモジュールから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句で毎回再バインドされるため)制御変数_に名前を付ける方がよい場合があります。たとえば、「特別だ」を明確に表示するために(さらに、対話型インタープリターでは、名前に_がプロンプトで入力されるたびに、その式の値に再バインドされるので、長い間固執する;-)。

とにかく、やりたいことを正確に決定したら、目的の関数を定義して開始するのは難しくありません。ファイル(インタラクティブセッションでのみ必要な場合)またはサイトカスタマイズファイル(すべてのスクリプトで必要な場合)。

50
Alex Martelli

いいえ、通訳を再起動するのが最善です

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

48
John La Rooy

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

この概念は namespace と呼ばれ、非常に優れているため、 Zen of Python になりました。

名前空間は素晴らしいアイデアの1つです。それらをもっとやってみましょう。

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

26
Jochen Ritzel
from IPython import get_ipython;   
get_ipython().magic('reset -sf')
4
Anurag Gupta

これはアレックスの答えの修正版です。次の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のように機能させることもできます。

3
Jug

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

3
tardis

globals()関数はディクショナリを返します。キーは名前を付けられるオブジェクトの名前です(そして、値はこれらのオブジェクトのidsです)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))
0
Kolay.Ne

アイドルIDEには、シェル/再起動シェルがあります。 Cntrl-F6がそれを行います。

0
Harold Henson