【问题标题】:Python slice with del statement带有 del 语句的 Python 切片
【发布时间】:2016-03-24 17:30:20
【问题描述】:

为什么会这样:

del a[:]

删除列表中的所有条目a

据我了解,a[:] 返回a 的副本。那么del a[:]不应该删除a的副本吗?

【问题讨论】:

  • 因为这就是它的定义? del 是一个语句,而不是一个函数,所以它不像你在传递一个切片给它。
  • a[:] 不返回副本它返回一个切片,例如a[:] = [1,2] 替换a 的内容而不是a 的副本。同样,切片上的del 定义为删除该切片的元素。

标签: python slice del


【解决方案1】:

del 是一个特殊的语句,它将检查原始值并使用给定的切片将其删除。
它在对象上调用__delitem__,对象自己处理删除。

如果您对幕后发生的操作感到好奇,欢迎您实现以下类并将 del 语句与不同的切片或键引用一起使用:

class A:
    def __delitem__(self, key):
        print(key)

解释器中的测试:

>>> a = A()
>>> del a[:]
slice(None, None, None)
>>> del a[2]
2
>>> del a["test"]
test

【讨论】:

  • 因此,如果我执行del a[:],它会为切片中的每个i 调用a.__delitem__(i),但如果我执行del a,它只会删除对象a 本身?
  • @spiderface 如果您使用a[:],它会将slice(None, None, None) 移交给a.__delitem__,但如果您使用del a,它确实会删除该对象(通过删除引用,如果不存在其他引用,则它调用对象的__del__ 并删除它)
  • @spiderface:不完全是。如果您del a,那么对list 的引用就会消失,但如果它在其他地方被引用,这些引用不会改变。 del a[:] 释放对a内容 的引用,因此a 和对该list 的任何其他引用现在都会看到一个空的list
  • @Bharel:如果最后一个引用被释放,它只会调用__del__;重要的是要区分释放引用(可能发生多次)和实际删除对象(发生一次,当最终引用被释放时)。
  • @ShadowRanger 在您发帖的同时编辑了评论 ;-)
猜你喜欢
  • 2013-02-04
  • 2019-04-18
  • 2021-08-10
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2017-06-24
  • 2017-08-09
相关资源
最近更新 更多