python中的嵌套命令式

python中的嵌套命令式,python,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: {'

我试图更新内部命令中的值,但在两者中都在更新,我尝试了很多,但仍然面临相同的问题。提前谢谢

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}
}

这是因为
d_main
的所有值都引用相同的dict对象
d_int
。对其中任何一个的更改都将反映在所有引用中

为避免此问题,请确保在理解列表期间使用复制方法(如
.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}}

短期解决方法:将d_int更改为d_int.copy(),您将获得输出。您正在引用同一对象。看看这两种情况下id的差异:

案例1(您的尝试) 返回:

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

如果您是新手,没有任何编程语言的编程经验,为了理解问题发生的原因,您最好先了解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
工作得很好。

d_int
更改为
d_int.copy()
,您就可以得到输出了。您正在引用同一个对象。警告:如果您有嵌套对象,例如dict中的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}}
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}}