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

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

csharp 复制代码
m = n = 3

初始化方式1

csharp 复制代码
a = [[0 for i in range(m)] for j in range(n)]

初始化方式2

csharp 复制代码
b = []
row = [0 for i in range(0,m)]
for i in range(0,n):
    b.append(row)

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

csharp 复制代码
for row in a:
    print(row)
for row in b:
    print(row)

当前的输出为:

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

csharp 复制代码
a[0][0] = 1
b[0][0] = 1

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

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

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

csharp 复制代码
a[0][1] = 1
b[0][1] = 1

for row in a:
    print(row)
print()
for row in b:
    print(row)
csharp 复制代码
a[1][2] = 1
b[1][2] = 1

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


很奇怪!!!

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

相关推荐
万邦科技Lafite13 分钟前
利用淘宝开放API接口监控商品状态,掌握第一信息
大数据·python·电商开放平台·开放api接口·淘宝开放平台
Hy行者勇哥2 小时前
Python 与 VS Code 结合操作指南
开发语言·python
大力水手(Popeye)2 小时前
Pytorch——tensor
人工智能·pytorch·python
飞翔的佩奇6 小时前
【完整源码+数据集+部署教程】表盘指针检测系统源码和数据集:改进yolo11-CA-HSFPN
python·yolo·计算机视觉·数据集·yolo11·表盘指针检测
larance7 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
搏博7 小时前
基于Python3.10.6与jieba库的中文分词模型接口在Windows Server 2022上的实现与部署教程
windows·python·自然语言处理·flask·中文分词
麦兜*8 小时前
Swift + Xcode 开发环境搭建终极指南
开发语言·ios·swiftui·xcode·swift·苹果vision pro·swift5.6.3
lxmyzzs8 小时前
pyqt5无法显示opencv绘制文本和掩码信息
python·qt·opencv
萧鼎9 小时前
Python pyzmq 库详解:从入门到高性能分布式通信
开发语言·分布式·python
艾伦~耶格尔10 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试