您可以解释为什么我们有以下行为:
>>> 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]原因)。
答案 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的问题。