我有一个这样设计的空嵌套字典:
{'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'
已被填满,而我只想填充红梨。
我做错了什么?怎么解决这个问题?
答案 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和新列表。