del运算符如何在python中的列表中工作?

时间:2013-12-30 20:37:58

标签: python list del

我已阅读python docs list以及del运算符如何工作,但我需要解释以下行为

在这种情况下,cl指向同一个对象(列表),因此对一个对象进行更改会影响另一个对象,但删除一个对象不会删除对象。那么这里发生了什么?只是列表对象的pointer丢失了吗?

>>> l = [1,2,3]
>>> c = l
>>> c.append(4)
>>> c
[1, 2, 3, 4]
>>> l
[1, 2, 3, 4]
>>> del c
>>> l
[1, 2, 3, 4]
>>> c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined

通过切片操作删除

>>> l
[1, 2, 3, 4]
>>> del l[::2]
>>> l
[2, 4]

l[::2]返回新列表。但del l[::2]进行就地删除。那么在这种情况下,是不是要返回一个新列表?到底发生了什么?

1 个答案:

答案 0 :(得分:14)

lc 绑定到同一个对象。它们都是对列表的引用,并且通过两个引用可以看到操作该列表对象。 del c 取消绑定 c;它删除了对列表的引用。

del l[::2]从列表中删除一组特定的索引,您现在正在列表对象本身上运行。您没有取消绑定l,而是解除了列表中 的索引。

您也可以将其与检索和设置值进行比较。 print cprint c[::2]不同,c = somethingc[::2] = something不同;两个示例中的第一个只访问列表对象,或者为c分配一个新值,后面的示例检索一个值切片或为切片索引设置新值。

在幕后,del c从处理所有变量的字典中删除名称cglobals()为您提供对此字典的引用)。 del l[::2]调用列表中的__delitem__ special method,传入slice()个对象。