0

我正在尝试替换 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(...)都进行操作才能更改整个字典?

4

2 回答 2

4

重新绑定与清除可变值不同。您将必须清除字典并为其提供新的键和值:

def replace(d):
    d.clear()
    d.update({'b': 2})

名称(变量)只是对对象的引用,将新字典分配给本地名称d会将名称重新绑定到新对象;前一个对象始终不受影响。

您可以创建d一个全局名称,以便将全局名称重新绑定到新字典,但任何其他剩余引用仍将指向未更改的原始字典。无论指向它的引用数量如何,清除实际的字典对象都会起作用。

于 2013-11-11T11:36:06.573 回答
1

内部是一个局部变量dreplace分配给它不会取代全局字典d

这可以通过使用global关键字来解决。

然而,清除字典并用新值重新填充它可能确实更好。

于 2013-11-11T11:36:23.167 回答