gpt4 book ai didi

python - 修改 `**kwargs` 字典总是安全的吗?

转载 作者:IT老高 更新时间:2023-10-28 20:34:23 28 4
gpt4 key购买 nike

使用Python函数语法def f(**kwargs),在函数中创建关键字参数字典kwargs,并且字典是可变的,所以问题是,如果我修改 kwargs 字典,是否有可能在我的函数范围之外产生一些影响?

根据我对字典解包和关键字参数打包工作原理的理解,我认为没有任何理由相信它可能不安全,而且在我看来,在 Python 3.6 中没有这种危险:

def f(**kwargs):
kwargs['demo'] = 9

if __name__ == '__main__':
demo = 4
f(demo=demo)
print(demo) # 4

kwargs = {}
f(**kwargs)
print(kwargs) # {}

kwargs['demo'] = 4
f(**kwargs)
print(kwargs) # {'demo': 4}

但是,这是特定于实现的,还是 Python 规范的一部分?我是否忽略了任何情况或实现(除非修改自身可变的参数,如 kwargs['somelist'].append(3))这种修改可能有问题吗?

最佳答案

它总是安全的。作为spec says

If the form “**identifier” is present, it is initialized to a new ordered mapping receiving any excess keyword arguments, defaulting to a new empty mapping of the same type.

已添加重点。

您总是可以保证在可调用对象中获得一个新的映射对象。看这个例子

def f(**kwargs):
print((id(kwargs), kwargs))

kwargs = {'foo': 'bar'}
print(id(kwargs))
# 140185018984344
f(**kwargs)
# (140185036822856, {'foo': 'bar'})

所以,虽然f可以修改通过**传递的对象,但不能修改调用者的**-object自己。


更新:由于您询问了极端情况,这里对您来说是一个特殊的 hell ,它实际上会修改调用者的 kwargs:

def f(**kwargs):
kwargs['recursive!']['recursive!'] = 'Look ma, recursive!'

kwargs = {}
kwargs['recursive!'] = kwargs
f(**kwargs)
assert kwargs['recursive!'] == 'Look ma, recursive!'

不过,这在野外你可能不会看到。

关于python - 修改 `**kwargs` 字典总是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45883655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com