关于python字典比较简单的一个问题

这是一个关于字典的问题,为什么仅仅只是对ems这个键进行操作,其他的键也会被改变?

直接运行就会看到结果,ems的运输中变成了1,圆通和韵达也变成了1,可是我只对ems进行了操作,请问这是为什么呢?


a = [['ems', '无物流信息', '异常'], ['圆通', '运输中', '异常'], ['圆通', '运输中', '异常'], ['圆通', '运输中', '异常'], ['圆通', '运输中', '异常'],
     ['韵达', '运输中', '异常'], ['圆通', '已签收', '正常'], ['圆通', '已签收', '正常'], ['圆通', '派件中', '正常'], ['圆通', '运输中', '异常']]
c = {}
d = {}

for f in a:
    if f[0] in c:
        pass
    else:
        c[f[0]] = {}
    if f[1] in d:
        pass
    else:
        d[f[1]] = 0
print(c)
print(d)

for f in c.keys():
    c[f] = d
print(c)

c['ems']['运输中'] = 1
print(c)

这里我采用的是for循环的形式给变量c赋值,但是当我采用直接赋值的形式给变量c赋值的时候就不会出现这种情况。

c = {'ems': {'无物流信息': 0, '运输中': 0, '已签收': 0, '派件中': 0}, '圆通': {'无物流信息': 0, '运输中': 0, '已签收': 0, '派件中': 0},
     '韵达': {'无物流信息': 0, '运输中': 0, '已签收': 0, '派件中': 0}}
c['ems']['运输中'] = 1
print(c)

for循环赋值语句中的d指向的是同一个字典的地址,所以不管怎么修改,同一个字典都会发生变化。
把d复制一下即可,下面两种方法都可以,

for f in c.keys():
    c[f] = d.copy()
print(c)
for f in c.keys():
    c[f] |= d
print(c)

d是一个变量,它存储的是那一串数据数据的地址。
你用循环将b变量中地址赋值给了c所有的value,他们都指向同一个地址,你改其中一个,其他的因为是指向的同一个,读出来的值也是相同的。

你下面这个是直接创建了一个字典键值对,每个key的vlue没有联系。