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
Run Code Online (Sandbox Code Playgroud)
b,a [1]都具有相同的id,但删除一个不会影响另一个.Python引用说明了这一点'del' on a subscription deletes the actual object,not the name object binding.输出:[1,3,4,5]证明了这statement.But怎么可能是"B"不受影响当两个a[0]和b具有相同的ID.
编辑:部分'del' on a subscription deletes the actual object,not the name object binding不正确.反之亦然.'del'实际上删除了名称,对象绑定.如果订阅上的'del'(例如del a [1])从列表对象中删除对象2,并且还删除当前a[1]绑定2并进行a[1]绑定3.后续索引遵循该模式.
del不删除对象,它删除引用.
有一个对象是整数值2.两个地方提到了一个单一的物体; a[1]和b.
你删除了a[1],所以参考已经消失了.但这对该对象 没有影响2,只对该对象有影响a[1].因此,通过名称可访问的引用b仍然2可以很好地到达对象.
即使你del所有的引用,这对对象没有影响.Python是一种垃圾收集语言,因此它负责注意何时对象不再被引用,以便它可以回收对象占用的内存.这将在对象不再可访问后的某个时间发生.1
1 CPython使用引用计数来实现它的垃圾收集2,它允许我们说对象通常会在它们的最后一个引用消失后立即被回收,但这是一个实现细节,而不是语言规范的一部分.您不必完全了解Python如何收集垃圾,也不应该编写依赖它的程序; 其他Python实现(如Jython,PyPy和IronPython)不以这种方式实现垃圾收集.
2加上一个额外的垃圾收集机制来检测循环垃圾,它引用计数无法处理.
del只是递减该对象的引用计数.所以在b = a[1]对象之后a[1]有2个(比方说)引用.删除a [1]后,它已经离开了list,现在只有1个引用,因为它仍然被引用b.在ref之前没有实际删除.count为0,然后仅在GC循环中.