【问题标题】:How does del operator work in list in python?del 运算符如何在 python 中的列表中工作?
【发布时间】:2014-01-17 18:54:28
【问题描述】:

我已经阅读了 listpython docs 以及 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] 进行就地删除。那么在这种情况下,不是返回一个新列表吗?这里到底发生了什么?

【问题讨论】:

    标签: python list del


    【解决方案1】:

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

    del l[::2] 从列表中删除一组特定的索引,您现在正在对列表对象本身进行操作。你没有解除绑定l,你解除了列表inside的索引。

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

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

    【讨论】:

    • 我知道print cprint c[::2] 不同,因为在后一种情况下,会返回一个新的列表对象。现在你对__delitem__ 的解释,传递切片对象非常有意义。但想知道,在将元素向左移动之前,相应的索引必须取消引用这些项目..正确吗?
    • 没错;这些索引是从列表中删除的引用。
    • print c[::2] 被翻译为c.__getitem__(slice(None, None, 2)),它可以返回任何它喜欢的东西。 list 返回一个带有值的新列表,是的。
    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多