Python buggy参数传递行为

Python buggy参数传递行为,python,parameter-passing,Python,Parameter Passing,我有一个功能: def greeter(name, greeting, punc): print greeting+', '+name+punc 我有一本带参数的字典: params={'name':'Mark','greeting':'How are you','punc':'?'} 当我调用函数作为greeter(**params)时,我得到了预期的输出你好吗,马克?。但是当我像这样调用greeter(*params)时,我得到了输出名称,puncgreeting。似乎param

我有一个功能:

def greeter(name, greeting, punc):
    print greeting+', '+name+punc
我有一本带参数的字典:

params={'name':'Mark','greeting':'How are you','punc':'?'}
当我调用函数作为
greeter(**params)
时,我得到了预期的输出
你好吗,马克?
。但是当我像这样调用greeter(*params)时,我得到了输出
名称,puncgreeting
。似乎
params
中的键列表已传递给
greeter
。这里到底发生了什么


只是好奇。

就像在dict上迭代产生键一样,以这种方式在位置扩展中使用它也会产生键

print list(params)
看起来params中的密钥列表已传递给greeter。这里到底发生了什么

事实上,这或多或少就是正在发生的事情

*x
期望
x
是一个iterable,并对其进行迭代,将结果逐个解释为参数。默认情况下,在dict上迭代会在其键上迭代。(例如,您可以使用
greeter(*(params.items())
)获得名称/值对,但dict仍然未排序,因此迭代顺序不可靠。)