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 指出的那样,在解包过程中,人们无法提前知道结果的长度,因此在实现方面,包罗万象的内容必须作为动态附加的列表开始。大多数情况下,将其转换为列表是浪费精力。
从语义上讲,我更喜欢有一个元组以保持一致性。
该 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)
也许,可变列表更适合这种类型的拆包。