【发布时间】:2021-07-26 08:45:28
【问题描述】:
考虑一下:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
这些是 Python 中删除元素的正确语句:
numbers[0:2] = []
numbers[3:5] = []
但是下面的说法是不允许的:
numbers[::2] = []
ValueError: 尝试将大小为 0 的序列分配给大小为 5 的扩展切片
是什么阻止了 Python 中的这种语句?
【问题讨论】:
-
对于连续切片,分配不同长度的可迭代对象的语义相对清晰。对于非连续切片,则更少:想象一下
numbers[::2] = [1],这应该是什么意思? -
我想我没有看到歧义。不就是
[1, 1, 1, 3, 1, 5, 1, 7, 1, 9]吗?替代解释是什么? -
numbers[0:2]是slice,而numbers[::2]是extended slice。如果问题真的是关于是什么阻止了这一点,而不是为什么阻止了这一点,那么这就是答案 -
@tdy 那么
numbers[::2] = [1, 2]的解释是什么? -
@tdy 说列表是
numbers = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],然后我们执行numbers[::2] = [1, 2]。它模棱两可的原因是因为分配可能以不同的方式发生,无论是[1, 0, 2, 0, 1, 0, 2, 0, 1, 0]或[1, 0, 2, 0, None, 0, None, 0, None, 0]或[1, 0, 2, 0, 2, 0, 2, 0, 2, 0]或[1, 0, 1, 0, 1, 0, 1, 0, 2, 0]或[[1, 2], 0, [1, 2], 0, [1, 2], 0, [1, 2], 0, [1, 2], 0]。与执行numbers[3:9] = [1, 2]不同,它只有 1 个含义,即删除项目 3:9 然后将 [1,2] 放在其位置产生[0, 0, 0, 1, 2, 0]。
标签: python