443

Pythonがキーワードを必要とする理由を私は本当に考えることができませんdel(そしてほとんどの言語は同様のキーワードを持っていないようです)。たとえば、変数を削除するのではなく、単に割り当てることができNoneます。また、辞書から削除するときに、delメソッドを追加することができます。

Pythonを使い続ける理由はありますdelか、それともPythonのガベージコレクション前の時代の痕跡ですか?

4

24 に答える 24

577

まず、ローカル変数以外のものを削除できます

del list_item[4]
del dictionary["alpha"]

どちらも明らかに役立つはずです。次に、delローカル変数を使用すると、意図がより明確になります。比較:

del foo

foo = None

del fooその場合、変数をスコープから削除することが意図されていることを私は知っています。それを行っているかどうかは明らかでfoo = Noneはありません。誰かが割り当てられたばかりならfoo = None、それはデッドコードだと思うかもしれません。しかし、コードを書いている人が何をしようとしていたかはすぐにわかりdel fooます。

于 2011-05-27T02:02:54.160 に答える
184

何をするかのこの部分がありますdelPython Language Referenceから):

名前を削除すると、ローカルまたはグローバル名前空間からその名前のバインディングが削除されます

名前に割り当てNoneても、名前空間から名前のバインディングが削除されるわけではありません。

(名前バインディングを削除することが実際に役立つかどうかについては、いくつかの議論があると思いますが、それは別の問題です。)

于 2011-05-27T01:41:49.113 に答える
21

変数の削除は、変数を None に設定することとは異なります

で変数名を削除するdelことは、おそらくめったに使用されないものですが、キーワードなしでは簡単に達成できないものです。と書くことで変数名を作成できるのであれば、aa=1を削除することで理論的に元に戻すことができるのはいいことです。

場合によっては、削除された変数にアクセスしようとすると NameError が発生するため、デバッグが容易になります。

クラスのインスタンス属性を削除できます

Python では、次のように記述できます。

class A(object):
    def set_a(self, a):
        self.a=a
a=A()
a.set_a(3)
if hasattr(a, "a"):
    print("Hallo")

クラスインスタンスに属性を動的に追加することを選択した場合、次のように記述して元に戻すことができるようにする必要があります。

del a.a
于 2016-06-28T10:18:54.653 に答える
20

例外を検査するために使用しているときに使用する必要がある場合の特定の例がありますdel(他にもあるかもしれませんが、これについてはすぐに知っています) 。sys.exc_info()この関数は、タプル、発生した例外のタイプ、メッセージ、およびトレースバックを返します。

通常、最初の2つの値はエラーを診断して対処するのに十分ですが、3番目の値には、例外が発生した場所と例外がキャッチされた場所の間の呼び出しスタック全体が含まれます。特に、あなたが次のようなことをするなら

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    if something(exc_value):
        raise

トレースバックは、最終tb的にコールスタックのローカルになり、ガベージコレクションできない循環参照を作成します。したがって、次のことを行うことが重要です。

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    del tb
    if something(exc_value):
        raise

循環参照を解除します。sys.exc_info()メタクラスマジックのように、呼び出したい場合は多くの場合、トレースバック役立ちます。そのため、例外ハンドラを終了する前に、必ずトレースバックをクリーンアップする必要があります。トレースバックが必要ない場合は、すぐに削除するか、次のようにします。

exc_type, exc_value = sys.exc_info()[:2]

それをすべて一緒に避けるために。

于 2011-05-27T01:54:19.240 に答える
4

使用できるものの例として、del次のような状況で役立つと思います。

def f(a, b, c=3):
    return '{} {} {}'.format(a, b, c)

def g(**kwargs):
    if 'c' in kwargs and kwargs['c'] is None:
        del kwargs['c']

    return f(**kwargs)

# g(a=1, b=2, c=None) === '1 2 3'
# g(a=1, b=2) === '1 2 3'
# g(a=1, b=2, c=4) === '1 2 4'

これら 2 つの関数は異なるパッケージ/モジュールに存在する可能性があり、プログラマーは実際にどのデフォルト値の引数があるかを知る必要はありませcf。そのため、kwargs を del と組み合わせて使用​​すると、「c のデフォルト値が欲しい」と言うことができます。

次のようなもので同じことができます。

def g(a, b, c=None):
    kwargs = {'a': a,
              'b': b}
    if c is not None:
        kwargs['c'] = c

    return f(**kwargs)

ただし、前の例の方がドライでエレガントだと思います。

于 2015-02-10T10:15:09.557 に答える
3

del が Python で役立つのはいつですか?

スライス構文の代わりに、配列の 1 つの要素を削除するために使用できますx[i:i+1]=[]os.walkこれは、たとえば、ディレクトリ内の要素を削除したい場合に役立ちます。ただし、メソッドを作成するだけでよいため、キーワードはこれに役立つとは考えていません[].remove(index)(.removeメソッドは実際には値の検索と削除の最初のインスタンスです)。

于 2011-05-27T01:47:47.470 に答える
2

del に独自の構文がある理由の 1 つは、del が参照する値ではなくバインディングまたは変数で動作する場合、関数で置き換えるのが難しい場合があるためだと思います。したがって、del の関数バージョンを作成する場合は、コンテキストを渡す必要があります。そして読みにくい。それでも、del を取り除くことは、一見めったに使用されないように思われるため、良いことだと思います。しかし、言語の機能や欠陥を取り除くのは骨の折れる作業です。多分python 4はそれを削除します:)

于 2011-05-27T02:28:36.307 に答える
0

del変数が再初期化されない限り、現在のスコープから変数を削除しています。に設定するとNone、現在のスコープに保持されます。

a = "python string"        
print(a)
del a
print(a)
a = "new python string"
print(a)

出力:

python string
Traceback (most recent call last):
  File "testing.py", line 4, in <module>
    print(a)
NameError: name 'a' is not defined
于 2020-12-04T09:25:40.857 に答える
-2

del は、多くの言語で「未設定」に相当し、別の言語から python に移動する相互参照ポイントとして..人々は、最初の言語で行っていたのと同じことを行うコマンドを探す傾向があります...設定も変数を "" または none にすると、変数がスコープから実際に削除されるわけではありません。その値を空にするだけです。変数自体の名前はまだメモリに格納されます...なぜ?!? メモリを集中的に使用するスクリプトで..ゴミをただの「いいえ」の後ろに置いておきます...そこにあるすべての言語には、なんらかの形式の「設定解除/削除」var関数があります..なぜpythonではないのですか?

于 2012-12-14T02:23:26.953 に答える
-2

私が使用しなければならなかったとき:

del serial
serial = None

のみを使用するため:

serial = None

シリアルポートをすぐに再び開くのに十分な速さで解放しませんでした。その教訓から私は、それがdel本当に意味することを学びました:「今すぐこれを GC して、それが完了するまで待ちます」そしてそれは多くの状況で本当に役に立ちます。もちろん、あなたは持っているかもしれませんsystem.gc.del_this_and_wait_balbalbalba(obj)

于 2012-09-27T17:09:20.780 に答える