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

Both b,a[1] have same id but deleting one isn't effecting the other.Python reference states that 'del' on a subscription deletes the actual object,not the name object binding. Output: [1,3,4,5] proves this statement.But how is it possible that 'b' remains unaffected when both a[0] and b have same id.

Edit: The part 'del' on a subscription deletes the actual object,not the name object binding is not true.The reverse is true. 'del' actually removes the name,object bindings.In case of 'del' on subscription (eg. del a[1]) removes object 2 from the list object and also removes the current a[1] binding to 2 and makes a[1] bind to 3 instead. Subsequent indexes follow the pattern.

4

4 回答 4

7

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

有一个对象是整数值2。一个对象被两个地方引用;a[1]b

您删除a[1]了 ,因此该引用消失了。但这对对象 没有影响2,只会对 in 中的引用产生影响a[1]。因此,通过名称可访问的引用仍然可以很好地b到达对象。2

即使你del所有的引用,这对对象没有影响。Python 是一种垃圾收集语言,所以它负责在一个对象在任何地方都不再被引用时进行通知,以便它可以回收该对象所占用的内存。这将在对象不再可访问后的一段时间内发生。1


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

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

于 2012-10-16T11:20:54.193 回答
6

del只是减少该对象的引用计数。所以在b = a[1]对象之后a[1]有2个(比方说)引用。删除 a[1] 后,它从 中消失了list,现在只有 1 个引用,因为它仍然被 引用b。在参考之前不会发生实际删除。count 为 0,然后只在一个 GC 周期。

于 2012-10-16T11:12:33.230 回答
2

这里有多个问题。首先,调用del列表成员会从列表中删除项目,这会释放对象的引用计数,但不会释放它,因为变量b仍然引用它。你永远不能解除分配你有参考的东西。

这里要注意的第二个问题是,接近于零的整数实际上是池化的,并且永远不会被释放。不过,您通常不必费心知道这一点。

于 2012-10-16T11:14:09.237 回答
0

它们具有相同的功能id,因为 Python 重用了idfor small integers,即使您删除了这些...这在文档中有所提及:

当前的实现为 -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 回答