Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-替换可变对象的函数_Python_Python 2.7 - Fatal编程技术网

Python-替换可变对象的函数

Python-替换可变对象的函数,python,python-2.7,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

我试图替换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(…)
才能更改整个dict?

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

def replace(d):
    d.clear()
    d.update({'b': 2})
名称(变量)只是对对象的引用,将新字典分配给本地名称
d
会将名称重新绑定到新对象;上一个对象始终不受影响


您可以将
d
设为全局,以便将全局名称重新绑定到新词典,但任何其他剩余引用仍将指向未更改的原始词典。清除实际的dictionary对象将起作用,而不管指向它的引用数是多少。

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

def replace(d):
    d.clear()
    d.update({'b': 2})
名称(变量)只是对对象的引用,将新字典分配给本地名称
d
会将名称重新绑定到新对象;上一个对象始终不受影响


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

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

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


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

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

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


但是,清除字典并重新填充新值可能确实更好。

如果OP摸索
d[:]=[1]
d=[1]
之间的差异,这就是…:)如果OP搜索到
d[:]=[1]
d=[1]
之间的差异-这就是…:)