python的splat运算符*和**在哪里有效?

cs9*_*s95 17 python function parameter-passing argument-unpacking iterable-unpacking

拆包/图示运营商***在横跨Python版本(2.7,3.X <3.5和3.x> = 3.5)其适用性广泛不同.

例如:

                                   |   2.7    |   3.1-3.4  |   3.5   
----------------------------------------------------------------------
function(*args)                         ?            ?          ?    

x, *y, z = [1, 2, 3, 4, 5]              x            ?          ?    

{**x, **y}                              x            x          ?    
Run Code Online (Sandbox Code Playgroud)

我错过了各种版本之间是否还有其他差异?我正在浏览PEP和Readmes,但文档并未详细说明.

Ash*_*ary 22

大约1992年(不确定Python版本).这是来自Python 1.0.1的语法文件.

# 06-Apr-92:
#   Use only '*' for varargs list

# 31-Mar-92:
#   Tighten syntax for try statements

# 27-Feb-92:
#   Allow NEWLINE* after eval input

# 16-Jan-92:
#   Added '*' as alternative for '+' in varargs syntax
#   (Not sure which alternative is better yet.)

# 11-Jan-92:
#   Variable length argument list syntax added: def f(a, b, +rest): ...
Run Code Online (Sandbox Code Playgroud)

Python 1.4+:

关键字参数:现在可以使用表单的关键字参数调用用Python编写的函数和方法keyword = value.

Python 1.6+

现在有一些特殊的语法可以代替apply() 函数使用.f(*args, **kwds)相当于apply(f, args, kwds).你也可以使用变体f(a1, a2, *args, **kwds),你可以留下一个或另一个:f(*args), f(**kwds).

Python <= 2.7:

在Python 3.0中删除了元组参数解包.

PEP 3113:删除了元组参数解包.你不能再写了def foo(a, (b, c)): ....请def foo(a, b_c): b, c = b_c改用.

Python 3.0+

PEP 3132:扩展的可迭代解包.你现在可以写像a, b, *rest = some_sequence.甚至*rest, a = stuff.其余对象始终是(可能为空)列表; 右侧可以是任何可迭代的.

PEP 3102:仅关键字参数.*args必须在调用中使用关键字语法指定在参数列表中出现的命名参数 .您还可以*在参数列表中使用bare 来指示您不接受可变长度参数列表,但是您确实有关键字参数

Python 3.5+

PEP 448,其他拆包概括.


据我所知,没有单个页面列出所有语法更改.每个版本的语法更改都列在Python的新内容部分中,或者您可以检查每个版本的语法规范以查看差异.

  • @Chris_Rands这是在Python 1.6中添加的.更新了答案. (2认同)