Python的解包运算符*和**是如何使用的?

18

展开/扩展操作符 *** 在 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          ✓    

我错过了各种版本之间的任何其他不同点吗? 我正在查看PEP和Readmes,但文档在这方面并不详细。

1个回答

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): ...

Python 1.4+:

关键字参数:现在可以使用如 keyword = value 形式的关键字参数调用用Python编写的函数和方法。

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中删除了元组参数解包(Tuple parameter unpacking)。

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。rest对象始终是一个(可能为空)列表;右侧可以是任何可迭代对象。

PEP 3102仅限关键字参数。在参数列表中出现在 *args 之后的命名参数必须在调用中使用关键字语法指定。还可以在参数列表中使用裸体的 * 来表示不接受可变长度参数列表,但是具有仅限关键字参数。

Python 3.5+

PEP 448,附加解包概括。


据我所知,没有一页显示所有语法更改。每个版本的语法更改都在Python新特性部分中列出,或者您可以检查每个发布版的语法规范以查看差异。


不错的研究;'varargs' 语法(*name)是在什么时候引入的?这比 Python 3 更早(或可能已经被移植)。 - Chris_Rands
@Chris_Rands 你是指分配中使用的那个吗? - Ashwini Chaudhary
我的意思是像 max(*(1,2,3)) 这样的。 - Chris_Rands
2
@Chris_Rands 这个功能是在 Python 1.6 中添加的。已在回答中更新。 - Ashwini Chaudhary
但是,仅仅执行 max((1, 2, 3, 4)) 就能正常工作。因此,使用明确的*解包(unpacking)*有什么优势呢? - kmario23
1
@kmario23 是的,max()min()可以处理可迭代对象和单个参数,但那只是Chris举的一个例子。 - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接