发布于 1年前

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不相同。

所以说在函数内修改关键字参数映射的字典是安全的。

©2020 edoou.com   京ICP备16001874号-3