gpt4 book ai didi

python - 可迭代解包和切片分配

转载 作者:行者123 更新时间:2023-12-04 18:18:48 26 4
gpt4 key购买 nike

L = [0, 1, 2]
L[::2], *rest = "abcdef"
print(L, rest)

预期输出:
['a', 1, 'b'] ['c', 'd', 'e', 'f']

实际输出:
ValueError: attempt to assign sequence of size 1 to extended slice of size 2

由于某种原因,无法将解包分配与扩展切片分配结合使用吗?为什么?我在 PEP 3132 -- Extended Iterable Unpacking 中没有看到任何明显的东西或者在 Python 数据模型中暗示这不应该是有效的。

最佳答案

这不是一个错误。当有多个左 watch 达式时,解包总是通过将右手迭代中的每个项目映射到相应的逗号分隔的左 watch 达式来完成。 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


您的:
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 表达式的可迭代对象中分配一项,使解释更加清晰,并且不易出现运行时错误。

关于python - 可迭代解包和切片分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55926533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com