是Python的splat运算符吗?

时间:2019-04-15 22:47:01

标签: python

今天,我看到了pyData 2017的一个演示,演示者使用python的splat运算符*。想象一下当我将其视为指针之前,他感到惊讶,直到他使用了该方法。我以为Python的splat运算符有点像省略号...,不是吗?谷歌搜索对我没有任何帮助。他们是在某个时候更改过它还是总是*?如果他们确实更改过,为什么?如果他们更改了实现差异和/或速度差异?

编辑:为愤怒的评论者打开“解压缩参数列表”。

1 个答案:

答案 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,而字典中的关键字参数为kwapply()在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]