为什么解压缩会给出列表而不是Python中的元组?

问题描述 投票:4回答:1

这对我来说真的很奇怪,因为默认情况下,我认为拆包会产生元组。

就我而言,我想使用prefix键进行缓存,因此最好使用元组。

# The r.h.s is a tuple, equivalent to (True, True, 100)
*prefix, seed = ml_logger.get_parameters("Args.attn", "Args.memory_gate", "Args.seed")
assert type(prefix) is list

但是我认为拆包会返回一个元组。

这里是相关的PEP:https://www.python.org/dev/peps/pep-3132/

-更新-

给出下面的评论和答案,特别是我期望解压缩得到一个元组,因为在函数参数中,散布arg始终是元组而不是列表。

正如Jason指出的那样,在解包过程中,人们将无法提前知道结果的长度,因此在实现方面,必须将所有内容作为动态追加的列表开始。在大多数情况下,将其转换为列表是在浪费精力。

语义上,我希望有一个元组以保持一致性。

python iterable-unpacking pep
1个回答
4
投票

此问题为mentioned in that PEP(PEP 3132):

在对python-3000列表[1]进行简短讨论之后,PEP被Guido接受为当前形式。讨论的可能更改是:[...]

  • 尝试给加星标的目标提供与源可迭代源相同的类型,例如,将为b中的a, *b = 'hello'分配字符串'ello'。这似乎不错,但不可能与所有可迭代对象保持一致。

  • 将加注星标的对象设为元组而不是列表。这将与函数的*args一致,但使结果的进一步处理变得更加困难。

但是正如您所看到的,当前尚未实现这些功能:

In [1]: a, *b, c = 'Hello!'
In [2]: print(a, b, c)
H ['e', 'l', 'l', 'o'] !

也许,可变列表更适合此类拆包。

© www.soinside.com 2019 - 2024. All rights reserved.