Python 函数内修改关键字参数**kw的安全性考虑
Python定义函数常常会使用关键字参数**kw来接收字典值。
基本语法
def f(p1,p2,**kw)
**kw将接收0个或任意个含参数名的参数,这些关键字参数在函数内部会自动组合为一个字典。
示例
def person(**kw)
for k in kw:
print k ,':', kw[k]
>>> person(name='Bob', age=35)
name:Bob
age:35
>>> kw = {'name': 'Bob', 'age': 35}
>>> person(**kw)
name:Bob
age:35
由于关键字参数**kw是可变的,我们在对关键字参数对应的字典做修改时,可能会犹豫下,对kw字典修改是否也修改了函数外的字典呢?
其实在函数内对关键字参数对应的字典做修改是安全的。
根据Python的函数定义,如果函数参数为关键字参数,它会新构建一个有序的map来接收关键字参数组合成字典。
示例
def f(**kwargs):
print((id(kwargs), kwargs))
kwargs = {'foo': 'bar'}
print(id(kwargs))
# 140185018984344
f(**kwargs)
# (140185036822856, {'foo': 'bar'})
这个示例分别输出函数内的字典和函数外的字典id,你可以看到这两个id不相同。
所以说在函数内修改关键字参数映射的字典是安全的。