当前位置: 首页 > news >正文

[Python]list.append字典的时候,修改字典会导致list内容变化的问题

今天写了这样的一段代码,出现了BUG。

log_message["EventName"] = "上架->可用"
log_message["EventNum"] = all_diff
event_log.append(log_message)

log_message["EventName"] = "可用->停用"
log_message["EventNum"] = stop_diff
event_log.append(log_message)

 BUG表现为,第二条log_message在event_log中出现了两次,第一条message则不见了。

网上可以找到一样的问题:[Python]list.append()在for循环中每次添加的都是最后的一个元素

主要原因是dict是一个可变的对象,list在append的时候,只是append了对象的引用,没有append对象的数据。修改了对象之后,之前append过的对象也会发生变化。

之前虽然知道dict可变,但以为是append之后,list会将数据固定下来,不再让其可变。事实证明list append的只是对象的引用。这样的思路其实也对,因为这样设计会节省内存。

 

要解决这个问题, 一是向list中插入不可变对象,如将dict变为tuple类型。

另外就是每次都插入一个新的对象,而不是对象的引用。如 event_log.append(log_message1),  event_log.append(log_message2).

完全重新声明一个log_message2对我来说有点麻烦,log_message的其他字段初始化有点繁琐。

所以我选择复制一个。复制的话依然需要小心引用的问题,有关拷贝对象可以参考这个:Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

import copy

log_message["EventName"] = "上架->可用"
log_message["EventNum"] = all_diff
event_log.append(log_message)

log_message2 = copy.deepcopy(log_message)
log_message2["EventName"] = "可用->停用"
log_message2["EventNum"] = stop_diff
event_log.append(log_message2)

  

 

转载于:https://www.cnblogs.com/oDoraemon/p/7066603.html

相关文章:

  • 转载: 8天学通MongoDB——第四天 索引操作
  • Math.floor(num) 与 Math.ceil(num)
  • 转载:什么时候可以不用实例化对象就可以调用类中成员函数
  • Android之MediaPlayer播放一般音频与SoundPool播放短促的音效
  • 九的余数
  • Android之使用摄像头拍照
  • luogu_2142 高精度减法
  • Android之录制视频文件
  • 在ASP.NET应用中执行后台任务
  • Gamma校正问题
  • Brendan Gregg ----Linux Performance Tools NEWS
  • 打印信息
  • Android中使用手势识别功能
  • hibernate之初学增删改查
  • Android之使用传感器获取相应数据
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Effective Java 笔记(一)
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java,console输出实时的转向GUI textbox
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Linux中的硬链接与软链接
  • node-glob通配符
  • Spring Boot快速入门(一):Hello Spring Boot
  • ucore操作系统实验笔记 - 重新理解中断
  • Web设计流程优化:网页效果图设计新思路
  • 产品三维模型在线预览
  • 深度学习中的信息论知识详解
  • 在weex里面使用chart图表
  • 正则表达式
  • 阿里云移动端播放器高级功能介绍
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​MySQL主从复制一致性检测
  • (NSDate) 时间 (time )比较
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)项目管理杂谈-我所期望的新人
  • .gitignore文件_Git:.gitignore
  • .NET MVC 验证码
  • .NET 常见的偏门问题
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net6Api后台+uniapp导出Excel
  • .netcore 获取appsettings
  • .NET程序员迈向卓越的必由之路
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @RunWith注解作用
  • [Bugku]密码???[writeup]
  • [BZOJ 1040] 骑士
  • [BZOJ] 3262: 陌上花开
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C puzzle book] types
  • [C++]运行时,如何确保一个对象是只读的