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

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

版权声明:著作权归作者所有。

相关推荐

Kotlin传递函数作为参数的方式

Kotlin传递函数作为参数,可以有:命名参数,位置参数以及在参数列表外,以lamba的形式传递。示例data class Person(val name: String,                &nb

Vue路由传递获取参数

通过Vue传递参数可以分为两种方式:params参数query参数params参数params参数传递方式分两种:路由配置参数使用$router的push编程式添加路由配置参数在路由中配置如下:{   path: '/user/:id',   name: 'user',   component: UserDe

Python安全创建目录的方法

在介绍Python安全创建目录之前,先举一个不安全创建目录的方式:if not os.path.exists(directory):     os.makedirs(directory) 在例子里,先判断目录是否存在,然后创建目录。这种方式是不安全的,它会导致竞争条件。在os.path.exists()和os.makedirs()之间的时