Python - 替换可变对象的函数

时间:2013-11-11 11:34:56

标签: python python-2.7

我正在尝试替换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}}才能更改整个词典?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

dreplace是一个局部变量,分配给它不会替换全局字典d

可以使用global关键字修复此问题。

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