星号*在python中是什么意思?

What does asterisk * mean in Python?

本问题已经有最佳答案,请猛点这里访问。

*在python中是否和在c中一样有特殊的含义?我在python食谱中看到了这样的函数:

1
def get(self, *a, **kw)

请你向我解释一下,或者指出我在哪里可以找到答案(谷歌将*解释为通配符,因此我找不到满意的答案)。

非常感谢你。


请参见语言参考中的函数定义。

If the form *identifier is
present, it is initialized to a tuple
receiving any excess positional
parameters, defaulting to the empty
tuple. If the form **identifier is
present, it is initialized to a new
dictionary receiving any excess
keyword arguments, defaulting to a new
empty dictionary.

另请参见函数调用。

假设您知道什么是位置参数和关键字参数,下面是一些示例:

例1:

1
2
3
4
5
6
7
8
# Excess keyword argument (python 2) example:
def foo(a, b, c, **args):
    print"a = %s" % (a,)
    print"b = %s" % (b,)
    print"c = %s" % (c,)
    print args

foo(a="testa", d="excess", c="testc", b="testb", k="another_excess")

正如您在上面的示例中看到的,我们在foo函数的签名中只有参数a, b, c。由于dk不存在,它们被放入args字典。程序输出为:

1
2
3
4
a = testa
b = testb
c = testc
{'k': 'another_excess', 'd': 'excess'}

例2:

1
2
3
4
5
6
7
8
# Excess positional argument (python 2) example:
def foo(a, b, c, *args):
    print"a = %s" % (a,)
    print"b = %s" % (b,)
    print"c = %s" % (c,)
    print args

foo("testa","testb","testc","excess","another_excess")

这里,由于我们测试的是位置参数,多余的参数必须放在末尾,并且*args将它们打包成一个元组,所以这个程序的输出是:

1
2
3
4
a = testa
b = testb
c = testc
('excess', 'another_excess')

还可以将字典或元组解包为函数的参数:

1
2
3
4
5
6
7
8
def foo(a,b,c,**args):
    print"a=%s" % (a,)
    print"b=%s" % (b,)
    print"c=%s" % (c,)
    print"args=%s" % (args,)

argdict = dict(a="testa", b="testb", c="testc", excessarg="string")
foo(**argdict)

印刷品:

1
2
3
4
a=testa
b=testb
c=testc
args={'excessarg': 'string'}

1
2
3
4
5
6
7
8
def foo(a,b,c,*args):
    print"a=%s" % (a,)
    print"b=%s" % (b,)
    print"c=%s" % (c,)
    print"args=%s" % (args,)

argtuple = ("testa","testb","testc","excess")
foo(*argtuple)

印刷品:

1
2
3
4
a=testa
b=testb
c=testc
args=('excess',)


我只有一件事要补充,那是其他答案中不清楚的(为了完整性)。

调用函数时也可以使用星号。例如,假设您有这样的代码:

1
2
3
4
>>> def foo(*args):
...     print(args)
...
>>> l = [1,2,3,4,5]

你可以把我的名单这样传给foo…

1
2
>>> foo(*l)
(1, 2, 3, 4, 5)

你也可以为字典做同样的事情…

1
2
3
4
5
6
>>> def foo(**argd):
...     print(argd)
...
>>> d = {'a' : 'b', 'c' : 'd'}
>>> foo(**d)
{'a': 'b', 'c': 'd'}


以上所有答案都是非常清楚和完整的,但就记录而言,我想确认python中*和**的含义与c中类似的looking操作符的含义完全不相似。

它们被称为参数解包和关键字参数解包运算符。


单星表示变量"a"将是提供给函数的额外参数的元组。双星表示变量"kw"将是一个包含关键字的额外参数的可变大小字典。

虽然实际的行为是规范化的,但有时仍然是非常不直观的。编写一些示例函数并使用各种参数样式调用它们可能有助于您了解允许的内容和结果。

1
2
3
4
5
def f0(a)
def f1(*a)
def f2(**a)
def f3(*a, **b)
etc...


我发现*在编写将另一个回调函数作为参数的函数时很有用:

1
2
3
4
5
6
def some_function(parm1, parm2, callback, *callback_args):
    a = 1
    b = 2
    ...
    callback(a, b, *callback_args)
    ...

这样,调用者可以传递任意的额外参数,这些参数将传递给他们的回调函数。好的是回调函数可以使用普通函数参数。也就是说,它根本不需要使用*语法。下面是一个例子:

1
2
3
4
5
6
7
8
def my_callback_function(a, b, x, y, z):
    ...

x = 5
y = 6
z = 7

some_function('parm1', 'parm2', my_callback_function, x, y, z)

当然,闭包提供了另一种方法来执行相同的操作,而不需要通过某个_函数()将x、y和z传递给我的_回调_函数()。