代码片段胜过一千个字,所以它们在这里:
# Creation of data_dict1
data_types = ('abnormal', 'normal')
data_dict1 = dict.fromkeys(data_types, {0: {}, 1: {}})
# Creation of data_dict2
data_dict2 = data_dict2 = {'abnormal': {0: {}, 1: {}}, 'normal': {0: {}, 1: {}}}
# Check
print(data_dict1)
print(data_dict2)
print(data_dict1 == data_dict2)
>>> {'abnormal': {0: {}, 1: {}}, 'normal': {0: {}, 1: {}}}
>>> {'abnormal': {0: {}, 1: {}}, 'normal': {0: {}, 1: {}}}
>>> True
正如您所看到的,嵌套字典 data_dict1 和 data_dict2 是相同的,无论其创建方法如何。 但是当我以相同的方式分配值时,我得到不同的结果:
data_dict1['abnormal'][0]['result'] = 'abnormal_0'
data_dict1['abnormal'][1]['result'] = 'abnormal_1'
data_dict1['normal'][0]['result'] = 'normal_0'
data_dict1['normal'][1]['result'] = 'normal_1'
data_dict2['abnormal'][0]['result'] = 'abnormal_0'
data_dict2['abnormal'][1]['result'] = 'abnormal_1'
data_dict2['normal'][0]['result'] = 'normal_0'
data_dict2['normal'][1]['result'] = 'normal_1'
# Check
print(data_dict1)
print(data_dict2)
print(data_dict1 == data_dict2)
>>> {'abnormal': {0: {'result': 'normal_0'}, 1: {'result': 'normal_1'}}, 'normal': {0: {'result': 'normal_0'}, 1: {'result': 'normal_1'}}}
>>> {'abnormal': {0: {'result': 'abnormal_0'}, 1: {'result': 'abnormal_1'}}, 'normal': {0: {'result': 'normal_0'}, 1: {'result': 'normal_1'}}}
>>> False
data_dict1['abnormal'][0]['result'] 和 data_dict1['abnormal'][0]['result'] 的值为分别为 'normal_0' 和 'normal_1',而不是应有的 'abnormal_0' 和 'abnormal_1'是。为什么会这样?
最佳答案
这是由于您启动 data_dict1
的方式造成的。
data_dict1 = dict.fromkeys(data_types, {0: {}, 1: {}})
执行此操作时,data_dict1
中的两个键都将设置为同一嵌套字典。这意味着在这些行之后:
data_dict1['abnormal'][0]['result'] = 'abnormal_0'
data_dict1['abnormal'][1]['result'] = 'abnormal_1'
字典中两个键的值,abnormal
和 normal
均已更改。如果我们此时检查 data_dict1
,我们会看到:
>>> data_dict1
{'abnormal': {0: {'result': 'abnormal_0'}, 1: {'result': 'abnormal_1'}},
'normal': {0: {'result': 'abnormal_0'}, 1: {'result': 'abnormal_1'}}}
当我们继续更改 normal
键的值时,会发生同样的事情,为我们提供您找到的结果。
我们可以使用 is
检查两个嵌套字典实际上是内存中的同一字典:
>>> data_dict1['abnormal'] is data_dict1['normal']
True
您通过实际为键分配不同的嵌套字典来启动data_dict2
,我们可以看到,与上面的方式相同:
>>> data_dict2['abnormal'] is data_dict2['normal']
False
我们可以避免这种行为,而不必像在data_dict2
中那样输入它。一种方法是使用字典理解:
>>> data_types = ('abnormal', 'normal')
>>> data_dict1 = {k: {0: {}, 1: {}} for k in data_types}
>>> data_dict1['abnormal'] is data_dict1['normal']
False
关于python - 为什么在相同但以不同方式创建的嵌套字典中将值分配给键会导致不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60204096/