将字典作为输入参数传递给函数全局/局部变量问题

时间:2017-11-01 14:01:17

标签: python dictionary

嗨,任何人都可以为我澄清这个问题。以下是代码示例:

def test1(d1):
    d1_adj = d1.copy()
    d1_adj.get(0)[0] *= 10
    return d1_adj

d1 = {0: [10, 10]}
d1_adj = test1(d1)
print d1
{0: [100, 10]}

为什么d1字典会更新?如果我想保留原始输入字典的值并且只更新已复制字典的值,我怎么能遇到这个问题

感谢名单

2 个答案:

答案 0 :(得分:5)

这是因为d.copy()是浅拷贝。您需要深层复制才能完成此任务。

from copy import deepcopy

然后

d1_adj = deepcopy(d1)

答案 1 :(得分:3)

copy按照您的意图执行浅拷贝,而不是深拷贝。因此,它不会在键0处创建整个列表的副本,并会修改原始列表。

您可以通过遍历一次来对字典中的值进行手动深层复制。或者更好的是,除非对使用它有任何要求,否则您可以使用copy模块进行perform deep copy(即copy.deepcopy)操作。您需要做的就是更新test1函数,如下所示。

from copy import deepcopy

def test1(d1):
    d1_adj = deepcopy(d1)
    d1_adj.get(0)[0] *= 10
    return d1_adj