今天,我看到了pyData 2017的一个演示,演示者使用python的splat运算符*
。想象一下当我将其视为指针之前,他感到惊讶,直到他使用了该方法。我以为Python的splat运算符有点像省略号...
,不是吗?谷歌搜索对我没有任何帮助。他们是在某个时候更改过它还是总是*
?如果他们确实更改过,为什么?如果他们更改了实现差异和/或速度差异?
编辑:为愤怒的评论者打开“解压缩参数列表”。
答案 0 :(得分:4)
否,Python的拆包运算符(有时称为“ splat”或“ spread”)从未使用过...
省略号。 Python具有an ...
/Ellipsis
literal value,但仅用作单例常量,用于在NumPy之类的库中表示多维范围。它没有内在的行为,在使用*
拆包运算符的位置在语法上也不是有效的。
我们可以看到Python 2.0(于2000年发布)的更改日志describes the new functionality of being able to use the *
unpacking operator to call a function,但是使用*
星号字符来定义可变参数函数(有时称为“其余参数”)早于此。
新的语法使调用带有参数元组和/或关键字参数字典的给定函数更加方便。在Python 1.5和更早版本中,您将使用
apply()
内置函数:apply(f, args, kw)
调用函数f()
,其参数为元组args
,而字典中的关键字参数为kw
。apply()
在2.0中是相同的,但是由于格雷格·尤因(Greg Ewing)的补丁,f(*args, **kw)
是实现相同效果的更短,更清晰的方法。此语法与定义函数的语法对称。
Python 1.0.1(1994年发布)的源代码仍然可用from the Python website,我们可以看一下其中的一些示例,以确认*
星号字符用于可变参数即使在那时,功能定义仍然存在。来自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]