为什么嵌套字典被错误地填充?

时间:2016-02-02 03:28:36

标签: python dictionary nested

我有一个这样设计的空嵌套字典:

{'PEAR': {'GREEN': [], 'YELLOW': [], 'RED': []}, 'APPLE': {'GREEN': [], 'YELLOW': [], 'RED': []}, 'COURGETTE': {'GREEN': [], 'YELLOW': [], 'RED': []}}

这是我的代码:

dictSub = {'RED' : [], 'GREEN' : [], 'YELLOW' : []}
arrMainCodes = ['APPLE', 'PEAR', 'COURGETTE']
dictAll = {}
numbers = {1 : [1, 2, 3], 2 : [4, 56, 7], 3 : [8, 2, 10]}

for item in arrMainCodes:
    dictAll[item] = dictSub
print(dictAll)
dictAll['PEAR']['RED'].append(478)
dictAll['PEAR']['RED'].append(47)
dictAll['PEAR']['RED'].append(8)
print(dictAll)
ITEM = [478, 7, 56]
for i in ITEM:
    if i not in dictAll['PEAR']['RED']:
        dictAll['PEAR']['RED'].append(i)
print(dictAll)

我试图以这样的方式填写它,只填充键'RED'的子列表'PEAR'。但是,我的结果如下:

{'PEAR': {'GREEN': [], 'YELLOW': [], 'RED': [478, 47, 8, 7, 56]}, 'APPLE': {'GREEN': [], 'YELLOW': [], 'RED': [478, 47, 8, 7, 56]}, 'COURGETTE': {'GREEN': [], 'YELLOW': [], 'RED': [478, 47, 8, 7, 56]}}

正如你所看到的,'RED'已被填满,而我只想填充红梨。

我做错了什么?怎么解决这个问题?

2 个答案:

答案 0 :(得分:2)

它们都是对单个字典的引用。您的前四个语句是唯一实际创建新词典对象的语句;您的for循环只会创建所有引用相同名称的其他名称。

您可以通过替换此分配来解决此问题:

dictAll[item] = dictSub

用这个:

dictAll[item] = dictSub.copy()

这将为您提供单独的词典,但每个词典仍然会引用相同的列表。要确保所有内容都是新副本,请改用deepcopy()

dictAll[item] = dictSub.deepcopy()

答案 1 :(得分:0)

问题是python。 Python从不复制任何对象。因此,无论何时分配dict或数组都会保留引用,每当更改引用时,更改都将反映在所有引用中。 你可以这样做。

arrMainCodes = ['APPLE', 'PEAR', 'COURGETTE']
dictAll = {}
numbers = {1 : [1, 2, 3], 2 : [4, 56, 7], 3 : [8, 2, 10]}

for item in arrMainCodes:
    dictAll[item]={'RED' : [], 'GREEN' : [], 'YELLOW' : []}
print(dictAll)
dictAll['PEAR']['RED'].append(478)
dictAll['PEAR']['RED'].append(47)
dictAll['PEAR']['RED'].append(8)
print(dictAll)
ITEM = [478, 7, 56]
for i in ITEM:
    if i not in dictAll['PEAR']['RED']:
        dictAll['PEAR']['RED'].append(i)
print(dictAll)

每次都会创建单独的dict和新列表。