正常参数与关键字参数

337 投票
10 回答
305193 浏览
提问于 2025-04-15 14:18

“关键字参数”和普通参数有什么不同呢?难道所有的参数不都可以用 name=value 的方式来传递,而不需要用位置的方式吗?

10 个回答

131

使用关键字参数和普通参数是一样的,只是顺序不重要。举个例子,下面这两个函数调用是一样的:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)
221

还有一个最后的语言特性,区分它们是很重要的。考虑下面这个函数:

def foo(*positional, **keywords):
    print "Positional:", positional
    print "Keywords:", keywords

*positional 参数会存储传递给 foo() 的所有位置参数,而且你可以提供任意数量的参数。

>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}

**keywords 参数会存储任何关键字参数:

>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}

当然,你也可以同时使用这两种参数:

>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}

这些特性虽然不常用,但有时候非常有用,所以了解哪些参数是位置参数,哪些是关键字参数是很重要的。

401

这里有两个相关的概念,都叫做“关键字参数”。

首先是在调用函数的时候,正如其他评论者提到的,你可以通过名字来指定一些函数的参数。你需要在所有没有名字的参数(也叫位置参数)之后提到这些名字,并且对于那些没有提到的参数,必须有默认值

另一个概念是在定义函数的时候:你可以定义一个函数,让它通过名字来接收参数——而且你甚至不需要指定这些名字是什么。这些就是纯粹的关键字参数,不能通过位置来传递。它的语法是

def my_function(arg1, arg2, **kwargs)

你传入这个函数的任何关键字参数都会被放到一个叫做kwargs的字典里。你可以在运行时查看这个字典的键,像这样:

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}

撰写回答