繁体   English   中英

可迭代的解包和切片分配

[英]Iterable unpacking and slice assignment

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中看到任何明显的东西- 扩展的Iterable Unpacking或Python数据模型中暗示这不应该是有效的。

这不是一个错误。 当有多个左手表达式时,总是通过将右侧可迭代中的每个项映射到相应的逗号分隔左手表达式来完成解包。 您的示例中的L[::2]表达式只是两个左手表达式中的一个,因此它只会从右侧可迭代的解包中接收一个项目,而带有星号的左侧表达式接收其余的表达式。

正如PEP-3132的基本原理指出:

许多算法需要在“第一个,休息”对中拆分序列。 使用新语法,

 first, rest = seq[0], seq[1:] 

由清洁剂取代,可能更有效:

 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的所述错误ValueError: attempt to assign sequence of size 1 to extended slice of size 2因为ValueError: attempt to assign sequence of size 1 to extended slice of size 2 "a"不能进一步解包。

如果Python要将解包的解释添加到语法中,它可以创建例如以下语句:

L[::2], *rest = "ab", "c", "d"

暧昧 - 如果L成为["a", 1, "b"]并且rest成为["c", "d"] ,或者L应该成为["ab", 1, "c"] ,并且rest变为["d"] 始终在每个LHS表达式的iterable中分配一个项使得解释更清晰,并且更不容易出现运行时错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM