为什么打印 `3 {}` 而不是 `2 {'a': 3}`?
Why does this print `3 {}` and not `2 {'a': 3}`?
def f(a=2, **b):
print(a,b)
f(**{'a':3})
为什么打印 3 {}
而不是 2 {'a': 3}
?
如果它是 f(a=3)
,我能理解为什么它打印 3 {}
,但我不明白这种情况下的输出。
拆包运算符在字典上使用时,会将字典的内容作为关键字参数传递。
换句话说,以下两行在功能上是相同的:
f(a=3)
f(**{'a':3})
由于 a
被 明确地 作为关键字参数传递,因此 2
的默认值被覆盖。由于没有传递其他参数,因此 **b
参数留空。
调用f(**{'a':3})
与f(a=3)
相同,所以a
的值为3而不是默认的2。对于b
,使用解包操作符**
,意思是把其他映射变量都存进去,因为没有,所以取值为空的dict
a
是 3
b
是空字典,{}
所以它打印 3 {}
要使用 b
,您需要传递名称与 a
不同的参数
# both print: 3 {'foo': 'bar', 'number': 100}
f(**{'a':3, 'foo':'bar', 'number':100})
f(a=3, foo='bar', number=100)
def f(a=2, **b):
print(a,b)
f(**{'a':3})
为什么打印 3 {}
而不是 2 {'a': 3}
?
如果它是 f(a=3)
,我能理解为什么它打印 3 {}
,但我不明白这种情况下的输出。
拆包运算符在字典上使用时,会将字典的内容作为关键字参数传递。
换句话说,以下两行在功能上是相同的:
f(a=3)
f(**{'a':3})
由于 a
被 明确地 作为关键字参数传递,因此 2
的默认值被覆盖。由于没有传递其他参数,因此 **b
参数留空。
调用f(**{'a':3})
与f(a=3)
相同,所以a
的值为3而不是默认的2。对于b
,使用解包操作符**
,意思是把其他映射变量都存进去,因为没有,所以取值为空的dict
a
是 3b
是空字典,{}
所以它打印 3 {}
要使用 b
,您需要传递名称与 a
# both print: 3 {'foo': 'bar', 'number': 100}
f(**{'a':3, 'foo':'bar', 'number':100})
f(a=3, foo='bar', number=100)