我正在尝试替换dict对象的值。以下脚本有效:
> d = {'a': 1}
> def f(d):
> return {'b': 2}
> d = f(d)
> print d
{'b': 2}
但这不是:
> d = {'a': 1}
> def replace(d):
> d = {'b':2}
> replace(d)
> print d
{'a': 1}
为什么呢?
因此,是否有必要对所有键d.pop(k)
进行d.update(...)
,然后{{1}}才能更改整个词典?
答案 0 :(得分:4)
重新绑定与清除可变值不同。您将 清除字典并为其提供新的键和值:
def replace(d):
d.clear()
d.update({'b': 2})
名称(变量)只是对象的引用,并且将新字典分配给本地名称d
会将名称重新绑定到新对象;上一个对象始终不受影响。
您可以将d
设为全局,以便将全局名称重新绑定到新词典,但任何其他剩余的引用仍将指向未更改的原始词典。无论指向它的引用数量如何,清除实际的字典对象都会起作用。
答案 1 :(得分:1)
d
内replace
是一个局部变量,分配给它不会替换全局字典d
。
可以使用global
关键字修复此问题。
然而,清除字典并用新值重新填充它可能确实更好。