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

epi*_*ang 6 python pep iterable-unpacking

这对我来说真的很奇怪,因为默认情况下我认为解包会给出元组。

就我而言,我想使用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
Run Code Online (Sandbox Code Playgroud)

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

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

- 更新 -

鉴于下面的评论和答案,特别是我期望解包给出一个元组,因为在函数参数中,展开参数始终是一个元组而不是一个列表。

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

从语义上讲,我更喜欢有一个元组以保持一致性。

trs*_*chn 6

该 PEP (PEP 3132)中提到了这个问题:

经过对 python-3000 列表[1]的简短讨论后,Guido 以当前形式接受了 PEP。讨论的可能的变化是:[...]

  • 尝试为加星标的目标提供与源可迭代相同的类型,例如,bina, *b = 'hello'将被分配 string 'ello'。这看起来不错,但不可能对所有可迭代对象都保持一致。

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

但如您所见,这些功能目前尚未实现:

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

也许,可变列表更适合这种类型的拆包。