为什么会出现意外的咒语

Niu*_*uya 2 python

我有一个数据表如下:

      A  B  C
type1 A1 B1 C1
type2 A2 B2 C2
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码

d={}
D={}
h = ['A','B','C']
type1=['A1','B1','C1']
type2=['A2','B2','C2']

for i,val in enumerate(h):

    d['Type1'] = type1[i]
    d['Type2'] = type2[i]
    D[val]=d
    print('loop',i,'\nd:',d,'\nD:',D,'\n\n====')

#print(D)
Run Code Online (Sandbox Code Playgroud)

我希望得到以下dict作为结果:

{'A':{'Type1':'A1','Type2':'A2'},'B':{'Type1':'B1','Type2':B2},'C':{'Type1':C1,'Type2':'C2'},}
Run Code Online (Sandbox Code Playgroud)

但是,输出是:

{'A': {'Type1': 'C1', 'Type2': 'C2'}, 'B': {'Type1': 'C1', 'Type2': 'C2'}, 'C': {'Type1': 'C1', 'Type2': 'C2'}}
Run Code Online (Sandbox Code Playgroud)

我逻辑中的错误是什么?

我无法弄清楚那里有什么问题.

我在循环中添加了一个打印件.

loop 0 
d: {'Type1': 'A1', 'Type2': 'A2'} 
D: {'A': {'Type1': 'A1', 'Type2': 'A2'}} 

====
loop 1 
d: {'Type1': 'B1', 'Type2': 'B2'} 
D: {'A': {'Type1': 'B1', 'Type2': 'B2'}, 'B': {'Type1': 'B1', 'Type2': 'B2'}} 

====
loop 2 
d: {'Type1': 'C1', 'Type2': 'C2'} 
D: {'A': {'Type1': 'C1', 'Type2': 'C2'}, 'B': {'Type1': 'C1', 'Type2': 'C2'}, 'C': {'Type1': 'C1', 'Type2': 'C2'}} 

====
Run Code Online (Sandbox Code Playgroud)

从输出中,d在每个循环中都是正确的但是D在非常循环中得到了改变!不知道为什么会这样.

Dan*_*man 6

您每次迭代都使用相同的字典.您应该将d的定义移动到循环中.

for i,val in enumerate(h):
    d = {}
    ...
Run Code Online (Sandbox Code Playgroud)