切片操作符何时在Python中创建浅层副本?

切片操作符何时在Python中创建浅层副本?,python,Python,我想请您帮助了解Python中切片操作符的行为 一方面,我们知道 L[:] 创建列表的浅表副本L。要验证它,只需打印即可 id(L),id(L[:]) 请注意,它们是不同的 另一方面,我们知道这一点 dell[:] 从原始对象中删除引用。它使原始列表为空,而不是它的浅显副本。当然,我同意创建一个浅表副本,然后删除其中的引用,没有什么意义,所以我理解,在这里,我们希望对原始列表进行操作 是否有规则说明切片操作符何时创建浅层副本,何时不创建?如果不进行手动测试,我如何知道它 我搜索了这个,找到了以下

我想请您帮助了解Python中切片操作符的行为

  • 一方面,我们知道
    L[:]
    创建列表的浅表副本
    L
    。要验证它,只需打印即可
    id(L),id(L[:])
    请注意,它们是不同的
  • 另一方面,我们知道这一点
    dell[:]
    从原始对象中删除引用。它使原始列表为空,而不是它的浅显副本。当然,我同意创建一个浅表副本,然后删除其中的引用,没有什么意义,所以我理解,在这里,我们希望对原始列表进行操作

  • 是否有规则说明切片操作符何时创建浅层副本,何时不创建?如果不进行手动测试,我如何知道它

    我搜索了这个,找到了以下主题:


    但不幸的是,他们没有回答我的问题,至少我没有看到它。

    dell[:]
    是一个与访问
    L[:]
    不同的操作,后者又是一个与
    L[:]=x
    不同的操作

    • dell[:]
      对具有
      切片
      对象的对象调用
      \u delitem\u
    • L[:]
      使用该
      切片
      对象调用
      \uu getitem\uuuuuuu
    • L[:]=x
      使用
      切片
      对象和
      x
      调用
      \uuuuu setitem\uuuuu
    根据对象的不同,这三种操作可以以非常不同的方式实现。对于内置列表类型,
    \uuuuuu delitem\uuuuu
    删除切片中指定的项,
    \uuuuuuu setitem\uuuuu
    使用给定的项替换项,
    \uuuuuu getitem\uuuuu
    返回由指定元素组成的新(复制)列表


    但是,并非所有对象都必须以这种方式运行。例如,对于NumPy
    数组
    \uuu getitem\uuuu
    和切片返回数组的视图,而不是副本-修改视图会改变原始数组。

    “是否有规则说明切片操作符何时创建浅层副本,何时不创建?”是的。它总是创建一个浅层副本。
    dell[:]
    的行为独立于
    L[:]
    的行为,因为前者转换为
    list.\u delitem\u(slice)
    ,而后者是
    list.\u getitem\u(slice)
    。您可以通过使用
    \uu getitem\uuuuuuu
    \uuuu delitem\uuuuuu
    创建一个类,然后获取并删除一个切片来验证这一点。在Python中,
    L[:]
    调用
    L.\uu getitem\uuuuuuuuuu
    。换句话说,
    del
    完全改变了声明的含义。首先感谢Vincent编辑我的帖子。发送后,我立即对其进行了编辑,并试图使其更好,但你太快了,我没有及时完成。谢谢你的帮助。你的回答正是我所需要知道的,以理解在这种情况下发生了什么。