我想请你帮忙解决一个有关 Python 切片操作符行为的问题。
- 一方面,我们知道
L[:]
会创建列表L
的一个浅拷贝。可以通过打印id(L), id(L[:])
并观察它们是否不同来验证。 - 另一方面,我们知道
del L[:]
会从原始对象中删除引用。这会导致原始列表为空 - 而不是其浅拷贝。当然,我同意先创建一个浅拷贝,然后再从中删除引用可能没有什么意义,所以我理解这里我们要操作的是原始列表。
是否有规定说明切片操作符何时创建浅拷贝,何时不创建呢?我如何在不进行手动测试的情况下知道呢?
我搜索了一下,并找到了以下主题:
但不幸的是,它们并没有回答我的问题,至少我没有看到。
del L[:]
的行为与L[:]
的行为无关,因为前者被翻译成list.__delitem__(slice)
而后者是list.__getitem__(slice)
。你可以创建一个有__getitem__
和__delitem__
方法的类,并获取和删除一个切片来验证这一点。 - Sergei LebedevL[:]
调用的是L.__getitem__
,而del L[:]
则会调用L.__delitem__
。换句话说,del
完全改变了语句的含义。 - GingerPlusPlus