今天,我看到了 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)