看起来 Python 的许多方面只是功能的复制。除了在 Python 中看到的 kwargs 和 dict 的冗余之外,是否存在其他区别?
看起来 Python 的许多方面只是功能的复制。除了在 Python 中看到的 kwargs 和 dict 的冗余之外,是否存在其他区别?
在参数解包(许多人使用kwargs
)和将dict
作为参数之一传递时存在差异:
使用参数解包:
# Prepare function
def test(**kwargs):
return kwargs
# Invoke function
>>> test(a=10, b=20)
{'a':10,'b':20}
传递字典作为参数:# Prepare function
def test(my_dict):
return my_dict
# Invoke function
>>> test(dict(a=10, b=20))
{'a':10,'b':20}
区别大致为:
**kwargs 支持其余参数),
- 参数解包可帮助您避免对“包含”参数的对象造成意外更改(这也不太重要,因为Python通常假定开发人员知道他们正在做什么,这是一个不同的主题),
test({0: 10, '0': 20})
(它将返回{0: 10, '0': 20}
),这很难用参数解包来替换。 - Tadeck在大多数情况下,您可以直接交换字典和 **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,如果将其与其他参数结合使用,您将拥有更多的灵活性:
def printer3(a, b=0, **kwargs):
return a,b,kwargs
#evaluate
>>> printer3(**my_dict)
(5, 6, {})
**kwargs
隐式地创建了一个名为kwargs
的dict
对象,并填充了键和值。这不是重复的功能。 - user166390