Python对象删除

tez*_*tez 4 python python-2.7

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.后续索引遵循该模式.

Ben*_*Ben 7

del不删除对象,它删除引用.

有一个对象是整数值2.两个地方提到了一个单一的物体; a[1]b.

你删除了a[1],所以参考已经消失了.但这对该对象 没有影响2,只对该对象有影响a[1].因此,通过名称可访问的引用b仍然2可以很好地到达对象.

即使你del所有的引用,这对对象没有影响.Python是一种垃圾收集语言,因此它负责注意何时对象不再被引用,以便它可以回收对象占用的内存.这将在对象不再可访问后的某个时间发生.1


1 CPython使用引用计数来实现它的垃圾收集2,它允许我们说对象通常会在它们的最后一个引用消失后立即被回收,但这是一个实现细节,而不是语言规范的一部分.您不必完全了解Python如何收集垃圾,也不应该编写依赖它的程序; 其他Python实现(如Jython,PyPy和IronPython)不以这种方式实现垃圾收集.

2加上一个额外的垃圾收集机制来检测循环垃圾,它引用计数无法处理.

  • @tez我想我最初误解了你的困惑.`b = a [1]`不将`b`设置为对'a [1]`的引用.它计算出当时`a [1]`引用的任何对象,然后使`b`成为对同一对象的另一个引用.此后引用`b`和`a [1]`没有连接(除了它们碰巧引用同一个对象,但是没有引用意识到这个事实并且改变一个对另一个不做任何事情). (2认同)
  • @tez Python对象与Java中的非原始对象一样,都是引用类型.它们确实与变量的相互作用非常相似.他们存储地址是一个实现细节,但它可能是其他任何东西.Eric Lippert的[引用不是地址](http://bit.ly/RPbpgn)解释得很好,尽管在C#的上下文中添加了实际指针.再说一遍,Python有`ctypes`模块可以有效地允许指针,而Java可能有类似的扩展(尽管可能是第三方 - 来自Jikes RVM的MMTK?). (2认同)

Jon*_*nts 6

del只是递减该对象的引用计数.所以在b = a[1]对象之后a[1]有2个(比方说)引用.删除a [1]后,它已经离开了list,现在只有1个引用,因为它仍然被引用b.在ref之前没有实际删除.count为0,然后仅在GC循环中.

  • `del`删除引用.引用计数是内部实现细节.声明"`del`只是递减该对象的引用计数`"对于大多数Python实现来说并非如此,只有最常用的实现. (5认同)