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

时间:2016-02-16 18:43:17

标签: python

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

  1. 一方面我们知道这一点 L[:] 创建列表L的浅表副本。为了验证它,可以打印 id(L), id(L[:]) 并注意到它们不同。
  2. 另一方面,我们知道这一点 del L[:] 从原始对象中删除引用。它使原始列表为空 - 而不是它的浅层副本。当然我同意创建一个浅拷贝,然后删除它的引用,没有多大意义,所以我理解这里我们想要在原始列表上运行。
  3. 是否有任何规则说当切片操作符创建浅拷贝时,何时不创建浅拷贝?如果不手动测试,我怎么知道呢?

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

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

1 个答案:

答案 0 :(得分:5)

del L[:]是一种与访问L[:]不同的操作,这又是L[:] = x的独特操作。

  • del L[:]使用__delitem__对象调用slice对象。
  • L[:]使用__getitem__对象调用slice
  • L[:] = x使用__setitem__对象和slice调用x

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

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