Pythonで変数をクリアする


207

Pythonで変数の値をクリアする方法はありますか?

たとえば、バイナリツリーを実装していた場合:

Class Node:
    self.left = somenode1
    self.right = somenode2

ツリーからノードを削除したい場合はself.left、空に設定する必要があります。


回答:


157

何が問題になっていself.left = Noneますか?


19
Noneキーワードに慣れていません。これは他の言語のnullに似ていますか?
Bnicholas

6
はい; nullと同等です。
Smashery

12
@Bnicholasただしnull、PHPとは異なりnull、PHPで変数をに設定すると、ほとんどの場合、そもそも変数を定義していない場合と同様の動作になります。NonePython のの値は、未定義の変数とはかなり異なります。ただし、None他のほとんどの化身とまったく同じですnull(少なくとも、より不可解な詳細に入るまで)。
ベン

キーワードではありません。これは、組み込みオブジェクトのデフォルトで設定された名前です。None不特定のタイプの他の「プレーン」オブジェクトで実行できることで何でも実行できます。コンテナに保存し、その文字列表現を印刷し、そのメタデータを確認します...とにかく、「python null」でGoogleを試しましたか同等」私は真剣です; 少し分析が必要になりますが、情報はそこにあります。
Karl Knechtel、2011年

18
pythonターミナルを開いてprint x入力し、Enter キーを押します。未定義の変数を出力しようとすると、ほとんどの言語と同様に、インタープリターエラーが発生します。しかし、変数を定義してから、Noneでそれをクリアしようとすると、print xコードを使用すると、単語Noneが出力として生成されます。私はpythonに慣れていないので誤解される可能性がありますが、これはクリアされた変数の動作のようには見えません。
Musixauce3000 2016年

408

delキーワードが行うだろう。

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

しかし、この場合、私は投票します self.left = None


18
完全に削除されないこともありますが、メモリ内のへの参照が削除されるだけです。これは、GCを取得しないゴースト変数をメモリに残す可能性があります。
Jakob Bowyer、2011年

4
delまた、存在しない変数を削除しようとすると、通常は望ましくない例外がスローされるという欠点もあります。
Philip Kearns、2014

33
たまたま組み込みコマンドを上書きしている変数を誤って宣言した場合、たとえば、type=… タイプするつもりだったときにtype(…)削除すると、元の機能に戻す最も簡単な方法であることを指摘したいと思います。つまり、Noneのままにしておくと、基になる関数へのアクセスが遮断されます。
mpacer

2
ガベージコレクション/コレクター/収集
mccc

1
これは私が探していたものでした。cmd行で遊んでいたとき、私は...を持ってい set = set(myList)て、関数(doh)としてsetをもう使用できないことに気付きました。をdel set使用すると、fxとして再び使用できました。もちろん、実際のスクリプトではその予約済み変数を使用することはありません。
jbchurchill 2017年

111

var = None 「値をクリア」して、変数の値を「None」の値のように「null」に設定しますが、変数へのポインタは残ります。

del var 変数の定義を完全に削除します。

後で変数を使用する場合、たとえば、変数に新しい値を設定する、つまり変数を保持するNoneほうがよいでしょう。


状況によっては存在しない変数を完全に削除したい場合はどうすればよいですか。エラーを回避するためのパラメータはありますか?いくつかの変数を削除する必要があります。dela、b、c、d loopとtry / exceptを使用できますが、それを避けるためにいくつかのスイッチを使用することをお勧めします。
Tedo Vrbanec、

63

実際には、それは変数/プロパティを削除しません。実行するのはその値をNoneに設定することだけなので、変数はメモリ内の領域を占有します。変数のすべての存在をメモリから完全に消去したい場合は、次のように入力できます。

del self.left

8
= Noneの答えがそれほど人気が​​ある理由がわかりません。これが正解です
ニコライグロモフ

1
OPは言ってclearいませんremove。delは属性とルックアップを強制終了します。これをNoneに設定することは、あなたがチェックできるよりもクリーンでif self.left、ノードが空かどうかをチェックするのに十分です。
user1767754

「Noneに設定する方がすっきりしています」-誰か(後であなた自身または共同作業者)がコードを読んでいる場合del、IMHOは、変数を '精神的に解析するときに忘れられる可能性があることをより明確にすることを検討する価値があります' コード。
Pocketsand

1
@NikolayGromovを日常のコードで使用して、self.leftの値を取得したい場合はif self.left:、をチェックしますか、それとも、どこでも処理しないとプログラムがクラッシュする可能性のあるNameError例外を処理しますか? ?
Pierre.Sassoulas

33
  • それを完全に削除したい場合は、以下を使用してdelください:

    del your_variable

  • それ以外の場合は、値を作成するNone

    your_variable = None

  • それはだ場合は反復可能(リストやタプルなど)、あなたはそれは次のように空にすることができます。

    your_variable.clear()

その後your_variable、空になります


2番目のオプションの場合、「内容のクリア」は正しくありません。これは変数をNoneに再割り当てするだけで、元のオブジェクトはそのまま残ります(参照カウントがゼロに減少しない限り、ガベージコレクションされます)。
cs95

0

変数を削除しますか?

わかりました、@ bnulの答えに対する最善の代替案があると思います。

あなたは個々の名前を削除することができますdel

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

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

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

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

この回答を再検討してください!


-1

私は上記のいくつかのオプションを使用しました:

del self.left

または値をNoneに設定して

self.left = None

値をNoneに設定する場合は、違いを理解し、いくつかの例外ハンドラーを配置することが重要です。テンプレートを使用して条件ステートメントの値を出力する場合は、次のようにします。

print("The value of the variable is {}".format(self.left))

変数の値が「変数の値はなし」と表示されている場合があります。したがって、いくつかの例外ハンドラをそこに置く必要があります:

if self.left:
    #Then only print stuff

上記のコマンドは、self.leftが存在しない場合にのみ値を出力します None

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