python中的**名称是什么?


59

在对Python进行编程时,有时会做**一个转换。我了解它的作用,但是我正在操纵什么数据结构?一个dict,另一个是什么?安array**运营商有名字吗?


3
指数运算符?
Rook 2012年

12
的含义有两个**。功率和“关键字参数字典”。你在说什么 该文档包含以下单词:“如果存在形式“ ** identifier”,则将其初始化为一个新字典,该字典将接收任何多余的关键字参数,默认为一个新的空字典。” 他们中哪些似乎与您的问题有关?
S.Lott,2012年

我要问的是“关键字参数字典”。谢谢你的意见。
Niklas Rosencrantz 2012年

Answers:


86

这不是一个运营商正因为如此,所以它并没有真正有一个名字,但它被定义为“语法规则”。因此应称为:

  • “关键字参数解包语法”

如果您有一组参数,*args则将其称为“参数解压缩”,以同样的方式**kwargs称为“关键字参数解压缩”

如果您在的左侧使用它=,例如a, *middle, end = my_tuple,您将说“ tuple unpacking”

总共有三种类型的(单个参数)参数:

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

*args参数称为“可变位置参数”,并且**kwargs为“可变关键字参数”。仅限关键字的参数不能在位置上给出,因为可变的位置参数将采用您传递的所有参数。

大部分内容都可以在PEP 03623102以及文档的“ 控制流”部分中找到。应当注意,功能签名对象PEP只是草稿,术语可能只是一个人的想法。但是无论如何,它们都是好词。:)

因此,*and **参数只是解压缩它们各自的数据结构:

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args)  f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1]:可迭代对象是实现__iter__()方法的对象,而映射是实现keys()和的对象__getitem__()。构造函数tuple()和可以理解支持该协议的任何对象dict(),因此可以将它们用于解压缩参数。


3
万一其他人感到困惑,那def f(x, *xs, y=0): pass不是有效的Python 2. {5,6,7}语法,也不def f(x, y=0, *xs):是您期望的那样。AFAIK,达到(显然)预期效果的唯一方法是def f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...。Python 3按预期处理原始语法。
chbrown

1
虽然我们在使用它:该begin, *middle, end = (0, 1, 2, 3, 4, 5)语法在Python 2.x中也不起作用。
Stefano Palazzo 2013年

在Python 3.5及更高版本中,此答案不正确。PEP-448将**运算符指定为字典解包运算符。参见python.org/dev/peps/pep-0448
devnul3

13

我没有名字。在“解压缩参数列表”下的Python文档中,它仅称为“ **-operator”。

我不确定“其他”数据结构的含义。当您f(**kwargs)解压缩字典时kwargs,将其作为键-值对的序列。我看不到涉及其他结构。

为了清楚起见,我将在上面的文档中复制该示例

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

另请参阅:* args和** kwargs是什么意思?


读者可能有几种可能的解释方式f(**kwargs)……
迪尔·亨特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.