我想请教您关于Python中切片运算符的行为的帮助。
L[:]
创建列表L
的浅表副本。为了验证它,可以打印
id(L), id(L[:])
并注意到它们不同。del L[:]
从原始对象中删除引用。它使原始列表为空 - 而不是它的浅层副本。当然我同意创建一个浅拷贝,然后删除它的引用,没有多大意义,所以我理解这里我们想要在原始列表上运行。是否有任何规则说当切片操作符创建浅拷贝时,何时不创建浅拷贝?如果不手动测试,我怎么知道呢?
我搜索了这个并找到了这些主题:
但不幸的是他们没有回答我的问题,至少我没有看到它。
答案 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__
会返回数组的视图而不是副本 - 修改视图会更改原始数组。