一, 使用方法
- 参数前加**
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
- 调用方式有两种,第一种:
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
- 第二种调用方式:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
二, 看到第二种调用方式, 不禁产生疑问, 这不就是直接传入对象吗? 有必要这么麻烦吗?
- 定义函数,不带有关键字参数
def person(name, age, kw):
kw['city'] = 'wuhan' #调用函数时, 对参数对象进行内部修改
print('name:', name, 'age:', age, 'other:', kw)
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, extra)
name: Jack age: 24 other: {'city': 'wuhan', 'job': 'Engineer'}
>>>print(extra)
{'city': 'wuhan', 'job': 'Engineer'} #函数内部修改对象后,会对外部对象有影响
- 定义函数,不带有关键字参数
def person(name, age, **kw):
kw['city'] = 'wuhan' #调用函数时, 对参数对象进行内部修改
print('name:', name, 'age:', age, 'other:', kw)
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'wuhan', 'job': 'Engineer'}
>>>print(extra)
{'city': 'Beijing', 'job': 'Engineer'} #函数内部修改对象后,会对外部对象没有影响
综上:使用关键字参数, 其实是对对象的一个拷贝, 函数内部无论怎么操作都不会对外部函数造成影响!!!