python - 为什么在相同但以不同方式创建的嵌套字典中将值分配给键会导致不同的结果?

标签 python python-3.x dictionary key dictionary-comprehension

代码片段胜过一千个字,所以它们在这里:

# 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_dict1data_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'

字典中两个键的值,abnormalnormal 均已更改。如果我们此时检查 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/

相关文章:

dictionary - F# 选项字典

python - 脚本每 24 小时重新启动一次 Heroku

python - 将 git branch 作为参数传递给 conda environment.yml 以获取 pip 包

python - Docker中的端口映射

python - Mrjob 无法在 dataproc 上创建集群 : __init__() got an unexpected keyword argument 'channel'

python字典错误AttributeError : 'list' object has no attribute 'keys'

arrays - 如何将字典加载到 UIPickerView

python - 使用 beautifulsoup 高效解析字符串

python - python 将二维整数数组转换为以逗号分隔的字符串

python - 数据类型为对象的日期格式问题