叮当over 2022-07-09 01:30 采纳率: 78.6%
浏览 15
已结题

关于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)

  • 写回答

2条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-07-09 02:54
    关注

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

    for f in c.keys():
        c[f] = d.copy()
    print(c)
    
    for f in c.keys():
        c[f] |= d
    print(c)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月9日
  • 已采纳回答 7月9日
  • 修改了问题 7月9日
  • 创建了问题 7月9日