【发布时间】:2016-05-28 04:58:08
【问题描述】:
我想就 Python 中切片运算符的行为向您寻求帮助。
- 一方面我们知道
L[:]创建列表L的浅表副本。要验证它,可以打印id(L), id(L[:])并注意到它们是不同的。 - 另一方面,我们知道
del L[:]从原始对象中删除引用。它使原始列表为空 - 而不是它的浅表副本。当然,我同意创建一个浅表副本,然后从中删除引用是没有意义的,所以我理解这里我们想要对原始列表进行操作。
是否有任何规则说明切片运算符何时创建浅拷贝,何时不创建?不手动测试怎么知道?
我搜索了这个并找到了这些主题:
但不幸的是,他们没有回答我的问题,至少我没有看到。
【问题讨论】:
-
"是否有规则说明切片运算符何时创建浅拷贝,何时不创建?"是的。它总是创建一个浅拷贝。
-
del L[:]的行为独立于L[:]的行为,因为前者转换为list.__delitem__(slice),而后者转换为list.__getitem__(slice)。您可以通过使用__getitem__和__delitem__创建一个类,然后获取和删除一个切片来验证这一点。 -
在 Python 中,
L[:]调用L.__getitem__,而del L[:]调用L.__delitem__。换句话说,del完全改变了语句的含义。 -
首先感谢文森特编辑我的帖子。发送后我立即对其进行了编辑并试图使其更好,但是您太快了,我没有及时完成。
标签: python