dict设置值的Python dict不匹配

时间:2017-04-05 22:26:09

标签: python dictionary

您可以解释为什么我们有以下行为:

>>> k = [0.5, 1, 2]
>>> m = [0.5, 1, 2]
>>> dict1 = dict.fromkeys(k, dict.fromkeys(m, 0))
>>> dict1
{0.5: {0.5: 0, 1: 0, 2: 0}, 1: {0.5: 0, 1: 0, 2: 0}, 2: {0.5: 0, 1: 0, 2: 0}}
>>> dict1[0.5][0.5]= 4.5
>>> dict1
{0.5: {0.5: 4.5, 1: 0, 2: 0}, 1: {0.5: 4.5, 1: 0, 2: 0}, 2: {0.5: 4.5, 1: 0, 2: 0}}


>>> dict2 = {0.5: {0.5: 0, 1: 0, 2: 0}, 1: {0.5: 0, 1: 0, 2: 0}, 2: {0.5: 0, 1: 0, 2: 0}}
>>> dict2[0.5][0.5] = 4.5
>>> dict2
{0.5: {0.5: 4.5, 1: 0, 2: 0}, 1: {0.5: 0, 1: 0, 2: 0}, 2: {0.5: 0, 1: 0, 2: 0}}

所以在第一种情况下,每当我尝试更改dict1的值时,所有具有相同第二个键的值都在变化(例如dict1 [0.5] [0.5] = 4.5也会改变dict1 [1] [0.5]原因)。

2 个答案:

答案 0 :(得分:1)

虽然这个常见问题很普遍,但我还没有找到一个好的目标:

因为dict.fromkeys(m, 0)在调用函数时运行一次,然后将相同的字典放在dict.fromkeys(k, dict.fromkeys(m, 0))的每个值中。你可以通过for dct in dict1: print id(dict1[dct])检查这一点,它们将是相同的id,例如。同一个对象:

>>> for dct in dict1: print id(dict1[dct])
140401847695352
140401847695352
140401847695352

这是因为参数仅在调用函数时被评估一次 ...因此dict.fromkeys将在每个键中放置相同的值(无论可能是什么)。它相当于:

default_dct = dict.fromkeys(m, 0)
dict1 = dict.fromkeys(k, default_dct)

相反,您可以使用词典理解:

dict1 = {key: {ikey: 0 for ikey in m} for key in k}

或通过复制:

inner_dct = dict.fromkeys(m, 0)
dict1 = {}
for key in k:
    dict1[key] = inner_dct.copy()

两者都产生不同的值:

>>>for dct in dict1: print id(dict1[dct])
140401847695352
140401847646200
140401847644240

答案 1 :(得分:0)

只创建了一个子词典。你现在拥有的是字典本身可以通过多种方式访问​​。 dict[0.5]dict[1]引用相同的字典(而不是它的副本)。

实现你想要做的事情的一种方法是使用词典理解:

dict1 = {k_outer: {k_inner:0 for k_inner in m} for k_outer in k}

这为每个键创建了一个新的嵌套dict,从而避免了它们都访问同一个嵌套dict的问题。