叮当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日

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改