这不是一个bug。当左侧表达式有多个时,始终通过将右侧迭代对象中的每个项目映射到相应的逗号分隔左侧表达式来执行解包操作。在您的示例中,
L[::2]
表达式只是两个左侧表达式之一,因此它仅从右侧迭代对象中接收一个项目,而星号左侧表达式接收其余部分。
正如 PEP-3132 中所指出的那样:
Many algorithms require splitting a sequence in a "first, rest" pair.
With the new syntax,
first, rest = seq[0], seq[1:]
is replaced by the cleaner and probably more efficient:
first, *rest = seq
your:
L[::2], *rest = "abcdef"
因此,它等同于:
L[::2], rest = "a", "bcdef"
这会导致错误
ValueError: attempt to assign sequence of size 1 to extended slice of size 2
,因为
"a"
不能被拆分成长度为2的序列。
如果Python将您对解包的解释添加到语法中,则可以使以下语句更易读:
L[::2], *rest = "ab", "c", "d"
这段代码存在二义性—— L
应该变成 ["a", 1, "b"]
且 rest
变成 ["c", "d"]
,还是应该将 L
变成 ["ab", 1, "c"]
,同时rest
变成 ["d"]
?为了避免运行时错误,每个 LHS 表达式总是分配一个可迭代项,这样解释就更清晰、更不容易出错。
a, L [:: 2] ="abc"
不起作用 (a, L [:: 2] =[1,[2,3]]
起作用,但没多大意义)。 这看起来像是一个错误。 - thebjorn