今天,我看到了pyData 2017的一个演示文稿,演示者使用了python的splat运算符*
。想象一下,在我使用该方法之前,我将其视为一个指针。我认为Python的splat运算符就像省略号...
No?谷歌搜索对我来说没什么。他们是在某些时候改变它还是总是*
?如果他们确实改变了,为什么?如果改变它,是否存在实施差异和/或速度差异?
编辑:愤怒评论者的“解包参数列表”。
不,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)
使用参数tuplef()
和字典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]