叮当over 2022-07-09 01:30 采纳率: 84.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日

悬赏问题

  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化