【问题标题】:Function which returns dictionary overwriting all dictionaries返回字典覆盖所有字典的函数
【发布时间】:2017-09-19 18:30:36
【问题描述】:

代码简要说明:

主代码首先创建一个空白字典,然后将其传递给我的函数。该函数计算每个数字的数量并更新然后返回的字典。但是,当函数执行时,它会将输入“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}

非常感谢

【问题讨论】:

标签: python function dictionary overwrite


【解决方案1】:

您将new_dictionary 设置为引用blank_dictionary。将行更改为new_dictionary = dict(blank_dictionary),你会没事的。使用dict() 构造函数将创建一个新的new_dictionary,因此blank_dictionary 不会被修改。

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

【讨论】:

  • 啊,我明白了,所以如果不使用 dict(),它就像 C 中的指针?非常感谢,这让我发疯了。
【解决方案2】:

这种行为不仅限于字典。在 Python 中,任何时候将可变对象传递给函数时,函数都会对原始对象而不是副本进行操作。对于元组和字符串等不可变对象,情况并非如此。

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

【讨论】:

    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2018-05-15
    • 2019-11-22
    • 2011-05-01
    相关资源
    最近更新 更多