4
a = [1,2,3,4,5]
b = a[1]
print id(a[1],b)   # out put shows same id.hence both represent same object.
del a[1]           # deleting a[1],both a[1],b have same id,hence both are aliases
print a            # output: [1,3,4,5]
print b            # output: 2

b、a [1]は両方とも同じIDを持っていますが、一方を削除してももう一方には影響しません。Pythonリファレンスには次のように記載されてい'del' on a subscription deletes the actual object,not the name object bindingます。出力:[1,3,4,5]はこのステートメントを証明します。しかし、両方が同じIDa[0]を持っている場合、「b」が影響を受けないままになる可能性はあります。b

編集:その部分'del' on a subscription deletes the actual object,not the name object bindingは真実ではありません。逆は真実です。'del'は、実際には名前、オブジェクトバインディングを削除します。サブスクリプションの' del'の場合(例:del a [1])、リストオブジェクトからオブジェクト2を削除し、代わりに現在のa[1]バインディングを削除し2a[1]バインドし3ます。後続のインデックスはパターンに従います。

4

4 に答える 4

7

delオブジェクトを削除せず、参照を削除します。

整数値のオブジェクトがあります2。その1つのオブジェクトは2つの場所から参照されました。a[1]およびb

を削除a[1]したため、参照がなくなりました。ただし、これはオブジェクト 2には影響せず、にあった参照にのみ影響しますa[1]。したがって、名前を介してアクセスできる参照bは、オブジェクトに問題なく到達します2

delすべての参照を行っても、オブジェクトには影響しませ。Pythonはガベージコレクションされた言語であるため、オブジェクトがどこからも参照されなくなったことを通知し、オブジェクトが占有しているメモリを再利用できるようにします。これは、オブジェクトに到達できなくなってからしばらくすると発生します。1


1 CPythonは、参照カウントを使用してガベージコレクションを実装します2。これにより、オブジェクトは通常、最後の参照がなくなるとすぐに再利用されると言えますが、これは実装の詳細であり、言語仕様の一部ではありません。Pythonがガベージを収集する方法を正確に理解する必要はなく、それに依存するプログラムを作成するべきではありません。Jython、PyPy、IronPythonなどの他のPython実装は、この方法でガベージコレクションを実装しません。

2さらに、参照カウントでは処理できない循環ガベージを検出するための追加のガベージコレクションメカニズム。

于 2012-10-16T11:20:54.193 に答える
6

delそのオブジェクトの参照カウントを単にデクリメントします。したがって、atの後b = a[1]にオブジェクトにa[1]は2つの(たとえば)参照があります。a [1]を削除すると、から削除listされ、参照が1つだけになります。これは、まだ参照されているためbです。参照まで実際の削除は発生しません。countは0で、GCサイクルのみです。

于 2012-10-16T11:12:33.230 に答える
2

ここでは複数の問題が発生しています。まず、リストメンバーを呼び出すdelと、リストからアイテムが削除され、オブジェクトの参照カウントが解放されますが、変数bが引き続きアイテムを参照しているため、アイテムの割り当てが解除されません。参照しているものの割り当てを解除することはできません。

ここで注意すべき2番目の問題は、ゼロに近い整数が実際にプールされ、割り当てが解除されることはないということです。ただし、通常はこれについてわざわざ知る必要はありません。

于 2012-10-16T11:14:09.237 に答える
0

これらを削除しても、idPythonは小さな整数にを再利用するため、これらは同じです...これはドキュメントに記載されています:id

現在の実装では、-5から256までのすべての整数の整数オブジェクトの配列が保持されます。その範囲でintを作成すると、実際には既存のオブジェクトへの参照が返されます。

この振る舞いを見ることができます:

>>> c = 256
>>> id(c)
140700180101352
>>> del c
>>> d = 256
>>> id(d)
140700180101352 # same as id(c) was

>>> e = 257
>>> id(e)
140700180460152
>>> del e
>>> f = 257
>>> id(f)
140700180460128 # different to id(e) !
于 2012-10-16T11:15:27.703 に答える