Python 的 splat 运算符……曾经是吗?

Dav*_*ick 2 python

今天,我看到了 pyData 2017 的一个演示,演示者使用了 python 的 splat operator *。想象一下我的惊讶,因为在他使用该方法之前,我将其视为一个指针。我认为 Python 的 splat 运算符类似于省略号,... 不是吗?谷歌搜索对我来说没有任何结果。他们是在某个时候改变了它还是一直都这样*?如果他们确实改变了它,为什么?如果他们更改了它,是否存在实现差异和/或速度差异?

编辑:愤怒的评论者的“解包参数列表”。

小智 5

不,Python 的解包运算符(有时称为“splat”或“spread”)从未使用过...省略号。Python 有一个.../Ellipsis字面值,但它仅用作单例常量,用于在 NumPy 等库中表示多维范围。它没有内在行为,并且在您将使用*解包运算符的位置在语法上无效。

我们可以看到 Python 2.0(2000 年发布)的更改日志描述了能够使用*解包运算符调用函数的新功能,但使用*星号字符来定义可变参数函数(有时称为使用“rest 参数”) ) 比那更旧。

新的语法使得使用参数元组和/或关键字参数字典调用给定函数变得更加方便。在 Python 1.5 及更早版本中,您将使用apply()内置函数:使用参数 tuple和字典中的关键字参数apply(f, args, kw)调用函数。在 2.0 中是相同的,但多亏了 Greg Ewing 的补丁,这是实现相同效果的更短更清晰的方法。此语法与定义函数的语法是对称的。f()argskwapply()f(*args, **kw)

Python 1.0.1(1994 年发布)的源代码仍可从 Python 网站 获得,我们可以查看他们的一些示例以确认*即使在那时也存在将星号字符用于可变参数函数定义。来自Demo/sockets/gopher.py

# Browser main command, has default arguments
def browser(*args):
        selector = DEF_SELECTOR
        host = DEF_HOST
        port = DEF_PORT
        n = len(args)
        if n > 0 and args[0]:
                selector = args[0]
Run Code Online (Sandbox Code Playgroud)

  • 嗯。我会称它为文字,就像 `1`、`2` 等是 `int` 文字而不是关键字或标识符一样。奇怪的是,[词法分析文档](https://docs.python.org/3/reference/lexical_analysis.html) 没有提到它;我想这不是一个单一的标记,而是 [grammar](https://docs.python.org/3/reference/grammar.html?highlight=grammar) 特别提到 `...` 被“标记化”为 `Ellipsis `. 语法还提到了 `...` 作为 *atom*,与其他文字相同。 (2认同)