Python方法/函数参数以星号和双星号开头

86

我不理解这些类型的函数在哪里使用,以及这些参数与普通参数有什么不同。我经常遇到它们,但从未有机会彻底了解它们。

例如:

def method(self, *links, **locks):
    #some foo
    #some bar
    return

我知道我可以查阅文档,但我不知道应该搜索什么。


3
查看之前的问题:https://dev59.com/vnVC5IYBdhLWcg3wdw25意思是什么:args和kwargs是在Python中常用的参数传递方式。它们允许在函数调用时传递不定数量的位置参数和关键字参数,以便更灵活地编写函数。args将位置参数作为元组传递,而kwargs将关键字参数作为字典传递。 - pyfunc
1
同上--这里有一个链接可以帮助你:http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/ - user798719
13
我知道我本可以搜索文档,但我不知道该搜索什么。在学习过程中经常发生这种情况。这有点像说“那东西在那玩意里是什么?”一些所谓的“专家”忘记了有时需要达到一定的理解水平才能知道如何提问。 - monsto
这是一个非常好的问题! - Nicolas S.Xu
1个回答

125

*args**kwargs 分别用于传递参数列表和字典。因此,如果我有这样一个函数:

def printlist(*args):
    for x in args:
        print(x)

我可以这样调用:

printlist(1, 2, 3, 4, 5)  # or as many more arguments as I'd like

为此

def printdict(**kwargs):
    print(repr(kwargs))

printdict(john=10, jill=12, david=15)

*args 就像一个列表一样,**keywordargs 就像一个字典一样,但您不必显式地将 listdict 传递给函数。

更多示例,请参见此处


5
你能明确地将列表或字典传递给这个函数吗? - User
可以的。如果你直接传入args[0],那么这个列表就是args[0]。另一方面,如果你在函数调用时使用星号(不是函数定义中的那个星号,而是在调用中使用),那么传递的列表将成为实际的args元组。 - Elvis Teixeira
1
*args 是一个元组(tuple),而不是一个列表(list)。 - AljoSt
def d(*args): ... print(type(args)) d(1, 2, 3) <type 'tuple'>
定义 d(*args)函数: ... 打印(type(args)) d(1, 2, 3) 元组类型
- Jack Peng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接