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)。

相关推荐
艾斯特_11 分钟前
混合检索与重排:提升召回与排序质量
后端·python·ai
网安墨雨17 分钟前
MySQL数据库 SQL语句详解
自动化测试·软件测试·数据库·python·sql·mysql
柠檬味的Cat18 分钟前
GEO优化系统哪家技术强
人工智能·python
KaMeidebaby28 分钟前
卡梅德生物技术快报|抗体筛选:抗体筛选中的噬菌体展示四参数调优——从流程设计到数据验证
开发语言·前端·javascript
大黄说说31 分钟前
接口频繁超时、报错?后端常见排查思路总结
开发语言·php
跨境小陈35 分钟前
2026 年如何使用 Python 抓取 Reddit 数据
开发语言·网络·python
殿方雪之下42 分钟前
OpenAI 兼容 API 接入实战:统一 Base URL 与用量控制
python
今天AI了吗1 小时前
Spring AI 框架实战:Java 后端集成大模型的架构设计与工程落地
java·人工智能·python·spring·机器学习
code bean1 小时前
【C#】 主构造函数(Primary Constructors)的来龙去脉
开发语言·c#
艾派森1 小时前
Web Scraper API vs 自建爬虫:一次真实对比测试,结果让人震惊
爬虫·python·网络爬虫