解包参数:只有命名参数可以跟*表达式

dre*_*ves 44 python arrays arguments

以下在Python中运行得非常好:

def f(x,y,z): return [x,y,z]

a=[1,2]

f(3,*a)
Run Code Online (Sandbox Code Playgroud)

a获取解压缩的元素,就好像你已经调用它f(3,1,2)并返回它一样[3,1,2].精彩!

但我不能解开的元素a第一个两个参数:

f(*a,3)
Run Code Online (Sandbox Code Playgroud)

f(1,2,3)我没有调用那样,而是"SyntaxError:只有命名参数才能跟*表达式".

我只是想知道为什么它必须是这样的,如果有任何聪明的技巧我可能不会意识到将数组解压缩到参数列表的任意部分而不诉诸临时变量.

dre*_*ves 33

正如Raymond Hettinger的回答所指出的,这可能会在Python 3中发生变化,这是一个相关的提案,已被接受.特别是与当前问题有关,这是对该提案的可能变更之一:

仅允许星号表达式作为exprlist中的最后一项.这将简化解包代码并允许为星号表达式分配迭代器.这种行为被拒绝了,因为它太令人惊讶了.

所以有解包函数参数限制的实现原因,但确实有点令人惊讶!

与此同时,这是我正在寻找的解决方法,回顾过去有点明显:

f(*(a+[3]))
Run Code Online (Sandbox Code Playgroud)

  • 如果`a`是元组:`f(*(a +(3,)))` (4认同)

Ant*_*ala 12

感谢PEP 448 - 附加拆包概括,

f(*a, 3)
Run Code Online (Sandbox Code Playgroud)

现在从Python 3.5开始接受的语法.同样,你可以在**任何地方使用双星关键字参数解包,其中一个可以多次使用.


Ray*_*ger 11

它并不必须是这样.Guido认为合情合理.

在Python 3中,解包的规则已经有所自由:

>>> a, *b, c = range(10)
>>> a
0
>>> b
[1, 2, 3, 4, 5, 6, 7, 8]
>>> c
9
Run Code Online (Sandbox Code Playgroud)

根据Guido是否认为它会改善语言,自由化也可以扩展到功能论点.

有关Python 3更改规则的原因的一些想法,请参阅有关扩展可迭代解包的讨论.