Pythonがキーワードを必要とする理由を私は本当に考えることができませんdel
(そしてほとんどの言語は同様のキーワードを持っていないようです)。たとえば、変数を削除するのではなく、単に割り当てることができNone
ます。また、辞書から削除するときに、del
メソッドを追加することができます。
Pythonを使い続ける理由はありますdel
か、それともPythonのガベージコレクション前の時代の痕跡ですか?
Pythonがキーワードを必要とする理由を私は本当に考えることができませんdel
(そしてほとんどの言語は同様のキーワードを持っていないようです)。たとえば、変数を削除するのではなく、単に割り当てることができNone
ます。また、辞書から削除するときに、del
メソッドを追加することができます。
Pythonを使い続ける理由はありますdel
か、それともPythonのガベージコレクション前の時代の痕跡ですか?
まず、ローカル変数以外のものを削除できます
del list_item[4]
del dictionary["alpha"]
どちらも明らかに役立つはずです。次に、del
ローカル変数を使用すると、意図がより明確になります。比較:
del foo
に
foo = None
del foo
その場合、変数をスコープから削除することが意図されていることを私は知っています。それを行っているかどうかは明らかでfoo = None
はありません。誰かが割り当てられたばかりならfoo = None
、それはデッドコードだと思うかもしれません。しかし、コードを書いている人が何をしようとしていたかはすぐにわかりdel foo
ます。
何をするかのこの部分がありますdel
(Python Language Referenceから):
名前を削除すると、ローカルまたはグローバル名前空間からその名前のバインディングが削除されます
名前に割り当て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
例外を検査するために使用しているときに使用する必要がある場合の特定の例があります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]
それをすべて一緒に避けるために。
使用できるものの例として、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 つの関数は異なるパッケージ/モジュールに存在する可能性があり、プログラマーは実際にどのデフォルト値の引数があるかを知る必要はありませc
んf
。そのため、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)
ただし、前の例の方がドライでエレガントだと思います。
del が Python で役立つのはいつですか?
スライス構文の代わりに、配列の 1 つの要素を削除するために使用できますx[i:i+1]=[]
。os.walk
これは、たとえば、ディレクトリ内の要素を削除したい場合に役立ちます。ただし、メソッドを作成するだけでよいため、キーワードはこれに役立つとは考えていません[].remove(index)
(.remove
メソッドは実際には値の検索と削除の最初のインスタンスです)。
del に独自の構文がある理由の 1 つは、del が参照する値ではなくバインディングまたは変数で動作する場合、関数で置き換えるのが難しい場合があるためだと思います。したがって、del の関数バージョンを作成する場合は、コンテキストを渡す必要があります。そして読みにくい。それでも、del を取り除くことは、一見めったに使用されないように思われるため、良いことだと思います。しかし、言語の機能や欠陥を取り除くのは骨の折れる作業です。多分python 4はそれを削除します:)
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
del は、多くの言語で「未設定」に相当し、別の言語から python に移動する相互参照ポイントとして..人々は、最初の言語で行っていたのと同じことを行うコマンドを探す傾向があります...設定も変数を "" または none にすると、変数がスコープから実際に削除されるわけではありません。その値を空にするだけです。変数自体の名前はまだメモリに格納されます...なぜ?!? メモリを集中的に使用するスクリプトで..ゴミをただの「いいえ」の後ろに置いておきます...そこにあるすべての言語には、なんらかの形式の「設定解除/削除」var関数があります..なぜpythonではないのですか?
私が使用しなければならなかったとき:
del serial
serial = None
のみを使用するため:
serial = None
シリアルポートをすぐに再び開くのに十分な速さで解放しませんでした。その教訓から私は、それがdel
本当に意味することを学びました:「今すぐこれを GC して、それが完了するまで待ちます」そしてそれは多くの状況で本当に役に立ちます。もちろん、あなたは持っているかもしれませんsystem.gc.del_this_and_wait_balbalbalba(obj)
。