[最近让我感到惊讶的是,即使在被拆包的序列具有另一种类型的情况下,“ splat”(一元*)运算符在项目拆包期间始终将切片作为list
捕获。
>>> x, *y, z = tuple(range(5)) >>> y [1, 2, 3] # list, was expecting tuple
与在不拆包的情况下如何编写此作业比较:
>>> my_tuple = tuple(range(5)) >>> x = my_tuple[0] >>> y = my_tuple[1:-1] >>> z = my_tuple[-1] >>> y (1, 2, 3)
也与splat运算符在函数参数中的行为不一致:
>>> def f(*args): ... return args, type(args) ... >>> f() ((), <class 'tuple'>)
为了在拆包后将
y
作为元组恢复,我现在必须写:
>>> x, *y, z = tuple(range(5)) >>> y = tuple(y)
这比基于切片的语法要好得多,但是尽管如此,我仍然认为这是非常不必要的和意想不到的优雅损失。有没有任何方法可以将
y
作为元组而不是列表进行恢复而无需事后分配处理?
我试图通过编写y
来强制python将x, *(*y,), z = ...
解释为元组,但是它仍然以列表的形式出现。当然还有x, *tuple(y), z
don't work in python之类的愚蠢事物。
我目前正在使用Python 3.6.9,但也欢迎使用更高版本的解决方案/建议/解释。
最近让我感到惊讶的是,即使在被拆包的序列具有另一种类型的情况下,即使在被拆包的序列具有其他类型的情况下,“ splat”(一元*)运算符始终在切片过程中始终将切片作为列表捕获。>>> x,* y,...] >
这是设计使然。
...可迭代的第一项是从左到右分配给已加星标的目标目标。可迭代的最后一项分配给被加星标的目标之后的目标。剩余物品清单然后将iterable中的分配给已加星标的目标(列表可以为空)。