Python 3.2中**kwargs和dict之间的区别是什么?

Python 3.2中**kwargs和dict之间的区别是什么?,python,syntax,dictionary,arguments,Python,Syntax,Dictionary,Arguments,python的许多方面似乎只是功能的复制品。除了我在Python中看到的kwargs和dict中的冗余之外,还有什么区别吗?在参数解包(许多人使用kwargs)和传递dict作为参数之一方面有区别: def printer3(a, b=0, **kwargs): return a,b,kwargs #evaluate >>> printer3(**my_dict) (5, 6, {}) 使用参数解包: #准备功能 def测试(**kwargs): 返回kwargs

python的许多方面似乎只是功能的复制品。除了我在Python中看到的kwargs和dict中的冗余之外,还有什么区别吗?

在参数解包(许多人使用
kwargs
)和传递
dict
作为参数之一方面有区别:

def printer3(a, b=0, **kwargs):
    return a,b,kwargs

#evaluate
>>> printer3(**my_dict)
(5, 6, {})
  • 使用参数解包:

    #准备功能
    def测试(**kwargs):
    返回kwargs
    #调用函数
    >>>试验(a=10,b=20)
    {'a':10,'b':20}
    
  • 将dict作为参数传递:

    #准备功能
    def测试(我的目录):
    把我的遗书还给我
    #调用函数
    >>>测试(dict(a=10,b=20))
    {'a':10,'b':20}
    
差异主要是:

  • 可读性(您可以简单地传递关键字参数,即使它们没有明确定义)
  • 灵活性(您可以使用
    **kwargs
    显式支持某些关键字参数,其余的则可以支持)
  • 参数解包可以帮助您避免对“包含”参数的对象进行意外更改(这不太重要,因为Python通常假定开发人员知道他们在做什么,这是另一个主题)

在大多数情况下,您可以直接交换dicts和**kwargs

例如:

my_dict = {'a': 5, 'b': 6}
def printer1(adict):
    return adict
def printer2(**kwargs):
    return kwargs

#evaluate:
>>> printer1(my_dict)
{'a': 5, 'b': 6}
>>> printer2(**my_dict)
{'a': 5, 'b': 6}
但是,如果将kwargs与其他参数结合使用,则kwargs具有更大的灵活性:

def printer3(a, b=0, **kwargs):
    return a,b,kwargs

#evaluate
>>> printer3(**my_dict)
(5, 6, {})

**kwargs
隐式创建一个加载了键和值的
dict
对象(命名为
kwargs
)。这不是重复的功能。请展开“许多方面”。还有哪些方面是重复功能?解包时,密钥必须有效identifiers@gnibbler:你说得对,+1。我完全错过了。作为一个例子,我将给出
测试({0:10,'0:20})
(它将返回
{0:10,'0:20}
),这很难用参数解包替换。