我已阅读python docs
list
以及del
运算符如何工作,但我需要解释以下行为
在这种情况下,c
和l
指向同一个对象(列表),因此对一个对象进行更改会影响另一个对象,但删除一个对象不会删除对象。那么这里发生了什么?只是列表对象的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]
进行就地删除。那么在这种情况下,是不是要返回一个新列表?到底发生了什么?
答案 0 :(得分:14)
l
和c
绑定到同一个对象。它们都是对列表的引用,并且通过两个引用可以看到操作该列表对象。 del c
取消绑定 c
;它删除了对列表的引用。
del l[::2]
从列表中删除一组特定的索引,您现在正在列表对象本身上运行。您没有取消绑定l
,而是解除了列表中 的索引。
您也可以将其与检索和设置值进行比较。 print c
与print c[::2]
不同,c = something
与c[::2] = something
不同;两个示例中的第一个只访问列表对象,或者为c
分配一个新值,后面的示例检索一个值切片或为切片索引设置新值。
在幕后,del c
从处理所有变量的字典中删除名称c
(globals()
为您提供对此字典的引用)。 del l[::2]
调用列表中的__delitem__
special method,传入slice()
个对象。