【问题标题】:Why does the assignment of values to keys in identical, but differently created nested dictionaries leads to different results?为什么将值分配给相同但不同创建的嵌套字典中的键会导致不同的结果?
【发布时间】:2020-05-28 22:34:57
【问题描述】:

代码 sn-ps 值一千字,所以在这里:

# 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'是。为什么会这样?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 谢谢,很清楚。那么像我为 data_dict1 所做的那样,使用函数 fromkeys() 创建嵌套字典有什么意义呢?有没有一种方法可以有效地初始化嵌套字典,而不必像我对 data_dict2 所做的那样?
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多