在python中嵌套字典

时间:2019-03-09 07:19:02

标签: python

我正在尝试更新内部字典中的值,但是两者都在更新,我做了很多尝试,但仍然面临相同的问题。预先感谢。

arr = [1,2]
d_int = {'a':False, 'e':False, 'i':False, 'o':False, 'u':False}
d_main ={i : d_int for i in range(len(arr))}
print(d_main)
d_main[0]['a'] = True
d_main[1]['i'] = True
print(d_main)

结果:

{0: {'a': True, 'e': False, 'i': True, 
     'o': False, 'u': False}, 
 1: {'a': True, 'e': False, 'i': True, 
     'o': False, 'u': False}
}

需要这样的东西:

{0: {'a': True, 'e': False, 'i': False,
     'o': False, 'u': False},
 1: {'a': False, 'e': False, 'i': True,
     'o': False, 'u': False}
}

3 个答案:

答案 0 :(得分:1)

这是因为d_main的所有值都引用相同的字典对象d_int。对其中任何一项的更改将反映在所有参考中。 Further read

为避免此问题,请确保在列表理解过程中使用诸如.copy之类的复制方法来创建dict对象的新副本。

arr = [1,2]
d_int = {'a':False, 'e':False, 'i':False, 'o':False, 'u':False}
d_main ={i : d_int.copy() for i in range(len(arr))} #modified.
print(d_main)
d_main[0]['a'] = True
d_main[1]['i'] = True
print(d_main)
#Output:
{0: {'a': True, 'e': False, 'i': False, 'o': False, 'u': False}, 1: {'a': False, 'e': False, 'i': True, 'o': False, 'u': False}}

答案 1 :(得分:1)

解决方法:将d_int更改为d_int.copy(),您将获得输出。您引用的是同一对象。查看这两种情况下id的区别:

案例1(您的尝试)

arr = [1,2]
d_int = {'a':False, 'e':False, 'i':False, 'o':False, 'u':False}
d_main ={i : d_int for i in range(len(arr))}
print(list(map(id,d_main.values())))

返回:

[140545244867248, 140545244867248] # <-- they are the same

情况2(可能的解决方法)

arr = [1,2]
d_int = {'a':False, 'e':False, 'i':False, 'o':False, 'u':False}
d_main ={i : d_int.copy() for i in range(len(arr))} # <-- .copy() added
print(list(map(id,d_main.values())))

返回:

[140545244796464, 140545244798480]

答案 2 :(得分:1)

如果您是新手,没有使用任何编程语言的编程经验,那么,为了理解为什么会发生问题,您最好首先了解C编程语言中的指针。


copy.deepcopy是最好的。 dict.copy在深层的dict中也有同样的麻烦。如下。

a = {"1": {"2": 2, "3": 3}, "4":4}

c = {1:a.copy()}
b = {1:a.copy()}

c[1]['1']['2'] = 5
c[1]['4'] = 40

print(c)
# {1: {'1': {'3': 3, '2': 5}, '4': 40}}
print(b)
# {1: {'1': {'3': 3, '2': 5}, '4': 4}}

但是copy.deepcopy与深层嵌套的dict配合得很好。

from copy import deepcopy

a = {"1": {"2": 2, "3": 3}, "4":4}

c = {1: deepcopy(a)}
b = {1: deepcopy(a)}

c[1]['1']['2'] = 5
c[1]['4'] = 40

print(c)
# {1: {'1': {'2': 5, '3': 3}, '4': 40}}

print(b)
# {1: {'1': {'2': 2, '3': 3}, '4': 4}}

实际上,这个问题不仅发生在嵌套dict上,其他类型也发生了,例如嵌套列表,具有dict属性的类等等,并且copy.deepcopy很好用。