函数签名中变量名前的 * 和 ** 是啥意思? [复制]

Posted

技术标签:

【中文标题】函数签名中变量名前的 * 和 ** 是啥意思? [复制]【英文标题】:What do * and ** before a variable name mean in a function signature? [duplicate]函数签名中变量名前的 * 和 ** 是什么意思? [复制] 【发布时间】:2012-07-04 03:02:39 【问题描述】:

可能重复:Understanding kwargs in Python

看过一段python代码,不知道这段代码中*和**是什么意思:

def functionA(self, *a, **kw):
   // code here

我只知道 * 的一种用途:提取它对方法或构造函数的参数的所有属性。

如果上述功能是这样,那么其余的:** 是什么?

【问题讨论】:

docs.python.org/tutorial/controlflow.html#keyword-arguments 【参考方案1】:

函数头内:

* 将所有位置参数收集在一个元组中。

** 收集字典中的所有关键字参数。

>>> def functionA(*a, **kw):
       print(a)
       print(kw)


>>> functionA(1, 2, 3, 4, 5, 6, a=2, b=3, c=5)
(1, 2, 3, 4, 5, 6)
'a': 2, 'c': 5, 'b': 3

函数调用中

* 将列表或元组解包到位置参数中。

** 将字典解压缩为关键字参数。

>>> lis=[1, 2, 3, 4]
>>> dic='a': 10, 'b':20
>>> functionA(*lis, **dic)  #it is similar to functionA(1, 2, 3, 4, a=10, b=20)
(1, 2, 3, 4)
'a': 10, 'b': 20

【讨论】:

有趣的功能,解释清楚。。现在可以看懂代码,也许有一天会在我自己的代码中找到它的用途。有关位置参数与关键字参数的清晰解释,另请参阅this answer【参考方案2】:

** 采用指定的参数名称并将它们放入字典中。所以:

def func(**stuff):
    print(stuff)

func(one = 1, two = 2)

将打印:

'one': 1, 'two': 2

【讨论】:

【参考方案3】:

** 表示函数的命名参数。

$ cat 2.py
def k(**argv):
    print argv

k(a=10, b = 20)

$ python 2.py
'a': 10, 'b': 20

argv 是一个包含函数所有命名参数的字典。

你也可以反转它。您可以将字典用作一组参数 对于函数:

def k(a=10, b=20):
  print a
  print b

d='a':30,'b':40
k(**d)

会打印

30
40

【讨论】:

以上是关于函数签名中变量名前的 * 和 ** 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#中变量名前的@符号是啥意思? [复制]

变量名前的下划线“_”对 Flutter 意味着啥

PHP中函数前的感叹号是啥意思

Swiftui 中 init() 中变量前的下划线是啥意思?

C语言里两个冒号是啥意思?

函数签名中的限制是啥意思?