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

python二维数组初始化的一个极其隐蔽的bug(浅拷贝)

初始化一个三行三列的矩阵

m = n = 3

初始化方式1

a = [[0 for i in range(m)] for j in range(n)]

初始化方式2

b = []
row = [0 for i in range(0,m)]
for i in range(0,n):b.append(row)

分别输出两个初始化的结果

for row in a:print(row)
for row in b:print(row)

当前的输出为:

在这里插入图片描述

当我修改[0,0]位置的数值的时候,奇怪事情发生了,两种初始化方式的不同导致结果的不同:

a[0][0] = 1
b[0][0] = 1for row in a:print(row)
print()
for row in b:print(row)

在这里插入图片描述

a数组是正常的输出,但是b数组的整列的值都发生了改变,很奇怪。

我再尝试修改其他位置的值,得到类似的结果:

a[0][1] = 1
b[0][1] = 1for row in a:print(row)
print()
for row in b:print(row)

在这里插入图片描述

a[1][2] = 1
b[1][2] = 1for row in a:print(row)
print()
for row in b:print(row)

在这里插入图片描述
很奇怪!!!

原因:是因为第一种初始化方式相当于定义了三个一维的列表,三个一维的列表之间不会相互影响。而第二种初始化方式是因为只定义了一个 叫做 row 的一维列表,append的过程中是浅拷贝这个row的过程(浅拷贝只是第一层,三个一维列表都指向了row,一维列表之间并不是相互独立的),所以在修改一维列表的内部的元素的时候,其他的append的row都被修改了(实际上是三行的一维列表都是一个row)。

相关文章:

  • Win32 SDK Gui编程系列之--ListView自绘OwnerDraw(续)
  • 幻兽帕鲁(Palworld)允许自建私服,它是怎么挣钱的呢?
  • 融资项目——配置redis
  • Go语言每日一练——链表篇(四)
  • c实现链表
  • 【网工】华为设备命令学习(Telnet)
  • sklearn实现数据标准化(Standardization)和归一化(Normalization)
  • vue3 解决ionic安卓版顶部状态栏空白问题
  • node.js 使用 elementtree 生成思维导图 Freemind 文件
  • Linux操作系统基础(一):操作系统概述
  • TCP和UDP相关问题(重点)(4)——4.使用TCP的协议有哪些?使用UDP的协议有哪些?
  • Cilium CNI深度指南
  • 【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )
  • TCP的连接和断开详解
  • 云计算运营模式介绍
  • 深入了解以太坊
  • bearychat的java client
  • classpath对获取配置文件的影响
  • JavaScript异步流程控制的前世今生
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue2.0项目引入element-ui
  • 翻译:Hystrix - How To Use
  • 飞驰在Mesos的涡轮引擎上
  • 猴子数据域名防封接口降低小说被封的风险
  • 机器学习 vs. 深度学习
  • 今年的LC3大会没了?
  • 前端
  • 前端学习笔记之观察者模式
  • 前嗅ForeSpider采集配置界面介绍
  • 如何解决微信端直接跳WAP端
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • FaaS 的简单实践
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​ArcGIS Pro 如何批量删除字段
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (独孤九剑)--文件系统
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)Dubbo快速入门、介绍、使用
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)平衡树
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例