切片运算符何时在Python中创建浅表副本?

Dri*_*zzt 5 python

我想请教您关于Python中切片运算符的行为的帮助.

  1. 一方面,我们知道 L[:] 创建列表的浅表副本L.为了验证它,可以打印 id(L), id(L[:]) 并注意它们是不同的.
  2. 另一方面,我们知道del L[:] 从原始对象中 删除引用.它使原始列表为空 - 而不是它的浅层副本.当然我同意创建一个浅拷贝,然后删除它的引用,没有多大意义,所以我理解这里我们想要在原始列表上操作.

是否有任何规则说当切片运算符创建一个浅拷贝而不是什么时候?如何在不手动测试的情况下了解它?

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

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

nne*_*neo 6

del L[:]是一个独特的访问操作L[:],这是一个独特的操作L[:] = x.

  • del L[:]__delitem__slice对象调用对象.
  • L[:]__getitem__用该slice对象调用.
  • L[:] = x__setitem__slice对象调用x.

这三种操作可以以非常不同的方式实现,具体取决于对象的内容.对于内置列表类型,__delitem__擦除切片中指定__setitem__的项目,将项目替换为给定的项目,并__getitem__返回由指定元素组成的(复制)列表.

但是,并非所有对象都必须以这种方式运行.例如,对于NumPy array,__getitem__使用切片返回数组的视图而不是副本 - 修改视图会更改原始数组.