是Python的splat运算符......一度吗?

问题描述 投票:1回答:1

今天,我看到了pyData 2017的一个演示文稿,演示者使用了python的splat运算符*。想象一下,在我使用该方法之前,我将其视为一个指针。我认为Python的splat运算符就像省略号... No?谷歌搜索对我来说没什么。他们是在某些时候改变它还是总是*?如果他们确实改变了,为什么?如果改变它,是否存在实施差异和/或速度差异?

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

python
1个回答
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)使用参数tuple 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]
© www.soinside.com 2019 - 2024. All rights reserved.