返回字典的函数覆盖所有字典

时间:2017-04-22 21:47:15

标签: python function dictionary overwrite

代码简要说明:

主代码首先创建一个空白字典,然后传递给我的函数。该函数计算每个数字的数量并更新随后返回的字典。但是当函数执行时,它会覆盖输入' blank_dictionary'与它返回的字典相同(' new_dictionary')。为什么会这样?我想要'字典'在主代码中保持空白,以便可以重复使用。

def index_list(lst, blank_dictionary):
    new_dictionary = blank_dictionary
    for i in lst:
        new_dictionary[i] += 1
    return new_dictionary

number = 1
maximum = 3
numbers = range(1,maximum+1)

dictionary = {}
for i in numbers:
    dictionary[i] = 0

print ('original blank dictionary', dictionary)
new_dictionary = index_list([3,3,3],dictionary)
print ('new dictionary which indexed the list', new_dictionary)
print ('should still be blank, but isnt', dictionary)

输出:

original blank dictionary {1: 0, 2: 0, 3: 0}
new dictionary which indexed the list {1: 0, 2: 0, 3: 3}
should still be blank, but isnt {1: 0, 2: 0, 3: 3}

非常感谢

2 个答案:

答案 0 :(得分:3)

您将new_dictionary设置为参考blank_dictionary。将行更改为new_dictionary = dict(blank_dictionary),你会没事的。使用dict()构造函数会生成新的new_dictionary,因此不会修改blank_dictionary

您可能需要调查defaultdict模块中的collections。如果您只需计算每个元素出现的次数,请考虑collections.counter

答案 1 :(得分:1)

此行为不仅限于dicts。在Python中,只要将可变对象传递给函数,该函数就会对原始对象进行操作,而不是对副本进行操作。对于像元组和字符串这样的不可变对象,情况并非如此。

但是在这种情况下,没有理由首先将空白字典传递给该函数。该函数可以创建一个新的字典并返回它。