9

我已阅读python docsforlist以及del运算符的工作原理,但我需要解释以下行为

在这种情况下,candl指向同一个对象(列表),因此对一个对象进行更改会影响另一个对象,但删除一个对象并不会删除该对象。那么这里会发生什么?只是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]会就地删除。那么在这种情况下,不是返回一个新列表吗?这里到底发生了什么?

4

1 回答 1

15

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

del l[::2]从列表中删除一组特定的索引,您现在正在对列表对象本身进行操作。你不是 unbinding l,你是在列表中取消绑定索引

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

在引擎盖下,从处理所有变量的字典del c中删除名称(为您提供对该字典的引用)。调用列表上的特殊方法,传入一个对象。cglobals()del l[::2]__delitem__slice()

于 2013-12-30T20:40:53.627 回答