
python没有内置的“数组”类型来直接支持多维数组,但我们可以通过列表的嵌套来模拟二维数组。例如,一个3x3的二维列表可以表示为[[1, 2, 3], [4, 5, 6], [7, 8, 9]]。
许多开发者在尝试初始化一个指定大小的二维列表时,可能会直观地使用如下方式:
side = 5
arr_wrong = [[0] * side] * side
print("初始化的错误数组:", arr_wrong)这段代码的意图是创建一个 side 行 side 列,所有元素初始为0的二维列表。然而,这种初始化方式存在一个严重的缺陷。让我们通过一个例子来观察其行为:
side = 3
arr_wrong = [[0] * side] * side
print("初始化的错误数组 (3x3):", arr_wrong)
# 尝试修改 arr_wrong[0][0]
arr_wrong[0][0] = 99
print("修改 arr_wrong[0][0] 为 99 后:", arr_wrong)输出结果:
芝士饼
芝士饼是一个一站式AI原生应用开发平台,简单几步即可完成应用的创建与发布。
84
查看详情
初始化的错误数组 (3x3): [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 修改 arr_wrong[0][0] 为 99 后: [[99, 0, 0], [99, 0, 0], [99, 0, 0]]
从输出可以看出,当我们修改 arr_wrong[0][0] 时,arr_wrong[1][0] 和 arr_wrong[2][0] 也随之改变了。这显然不是我们期望的结果。
原因解析: 问题出在 [[0] * side] * side 这行代码的执行方式上。
简单来说,arr_wrong 中的所有子列表实际上都指向内存中的同一个列表对象。因此,当你修改其中一个子列表的元素时,你实际上是在修改那个唯一的共享列表,这会导致所有引用它的“子列表”都反映出相同的变化。这是一种典型的“浅拷贝”问题。
为了避免上述陷阱,我们应该确保每个子列表都是一个独立的列表对象。实现这一目标的最佳方式是使用列表推导式(List Comprehension):
side = 5
arr_correct = [[0] * side for _ in range(side)]
print("初始化的正确数组:", arr_correct)让我们再次通过一个例子来验证这种方法的行为:
side = 3
arr_correct = [[0] * side for _ in range(side)]
print("初始化的正确数组 (3x3):", arr_correct)
# 尝试修改 arr_correct[0][0]
arr_correct[0][0] = 99
print("修改 arr_correct[0][0] 为 99 后:", arr_correct)输出结果:
初始化的正确数组 (3x3): [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 修改 arr_correct[0][0] 为 99 后: [[99, 0, 0], [0, 0, 0], [0, 0, 0]]
这次,修改 arr_correct[0][0] 只影响了第一个子列表,其他子列表保持不变。这正是我们期望的正确行为。
原因解析: 列表推导式 [[0] * side for _ in range(side)] 的工作原理如下:
这里的 _ 是一个惯用的变量名,用于表示循环变量的值在循环体中不被使用,我们只关心循环的次数。
现在,我们结合一个实际场景,演示如何将用户输入(例如一行一个字符串)正确地填充到一个预先正确初始化的二维列表中。
side = 5 # 定义二维列表的边长,例如 5x5
# 1. 正确初始化一个 side x side 的二维列表
# 确保每个子列表都是独立的,初始值可以根据需要设定,这里用空字符串或None
arr = [[''] * side for _ in range(side)]
print(f"请按行输入 {side}x{side} 的数据。每行输入一个长度为 {side} 的字符串。")
input_lines = []
# 2. 接收用户输入,这里模拟了原问题中的输入方式
for r_idx in range(side):
# 提示用户输入,并确保输入长度符合要求
while True:
line_input = input(f"请输入第 {r_idx + 1} 行数据 (长度为 {side}): ")
if len(line_input) == side:
input_lines.append(line_input)
break
else:
print(f"输入长度不正确,请重新输入,需要 {side} 个字符。")
# 3. 将接收到的字符串数据填充到二维列表中
for r_idx in range(side): # 遍历行索引
current_row_str = input_lines[r_idx]
for c_idx in range(side): # 遍历列索引
arr[r_idx][c_idx] = current_row_str[c_idx] # 将字符串的每个字符赋给对应位置
print("\n最终生成的二维列表:")
for row in arr:
print(row)
# 4. 验证独立性:修改一个元素,检查是否会影响其他行
arr[0][0] = 'X' # 将 arr[0][0] 修改为 'X'
print("\n修改 arr[0][0] 为 'X' 后:")
for row in arr:
print(row)示例运行(假设用户输入):
请按行输入 5x5 的数据。每行输入一个长度为 5 的字符串。 请输入第 1 行数据 (长度为 5): ABCDE 请输入第 2 行数据 (长度为 5): FGHIJ 请输入第 3 行数据 (长度为 5): KLMNO 请输入第 4 行数据 (长度为 5): PQRST 请输入第 5 行数据 (长度为 5): UVWXY 最终生成的二维列表: ['A', 'B', 'C', 'D', 'E'] ['F', 'G', 'H', 'I', 'J'] ['K', 'L', 'M', 'N', 'O'] ['P', 'Q', 'R', 'S', 'T'] ['U', 'V', 'W', 'X', 'Y'] 修改 arr[0][0] 为 'X' 后: ['X', 'B', 'C', 'D', 'E'] ['F', 'G', 'H', 'I', 'J'] ['K', 'L', 'M', 'N', 'O'] ['P', 'Q', 'R', 'S', 'T'] ['U', 'V', 'W', 'X', 'Y']
可以看到,arr[0][0] 被成功修改为 'X',而其他行的对应列元素(如 arr[1][0]、arr[2][0] 等)并未受到影响,这证明了列表是独立且正确初始化的。
通过掌握正确的二维列表初始化方法,你可以避免常见的编程错误,确保数据结构的完整性,从而编写出更可靠、更易于维护的Python代码。
以上就是Python中二维列表(2D List)的正确初始化方法与常见陷阱解析的详细内容,更多请关注其它相关文章!
# 是一个
# 淮安行业关键词排名
# 内江seo搜索优化
# 湖北专业网站推广
# 阿克苏好网站建设价格
# 杭州知名网站建设哪家好
# 海东seo优化推广运营
# 郑州网站推广¥做下拉去118cr
# 长沙seo优化好吗
# 不备案网站建设问题
# 广州网站建设基本流程
# 是在
# python
# 都是
# 的是
# 芝士
# 行数
# 数据结构
# 长度为
# 请输入
# 多维
# python编程
# app
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
Go语言反射机制:如何访问被嵌入结构体遮蔽的方法
123平台官方登录入口 123邮箱网页端在线沟通工具
《新三国志曹操传》游历事件袁尚突围攻略
Win11如何分屏操作_Win11多窗口分屏技巧
Win10截图远程协助 Win10远程桌面截屏法【场景应用】
深入理解J*aScript异步操作:setTimeout与调用栈的真相
《画加》约稿流程
虫虫助手如何更新游戏
六级准考证号怎么查_四六级准考证查询入口官网
处理含命名空间的XML文件 Power Query中的高级技巧
PHP页面重载时变量值不重置的实现方法
苹果手机手电筒无法开启
百度识图图像分析 百度识图识别平台
怎么恢复删除的电脑文件_数据恢复软件使用教程
在VS Code中利用AI辅助进行代码迁移
Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】
QQ阅读小说搜索入口地址_QQ阅读小说搜索入口地址搜索在线阅读
《兴业银行》注册登录方法
mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法
管理打开的编辑器:固定、分组和关闭技巧
抖音网页版地址直接进入_抖音网页版在线观看入口
Golang如何使用log记录日志信息_Golang log日志记录方法总结
英国搜索:多数英国人认为语言搜索是未来搜索
歌词怎么展示在|直播|间视频号?有什么注意事项?
繁花漫画使用教程
Excel如何制作月度销售统计图_Excel动态图表制作与控件应用
在J*a里什么是行为抽象_抽象行为对代码复用的提升作用
胃动力不足?试试这5个调理方法
利用Flexbox实现图片元素的二维布局:2x2网格排列指南
解决SQLAlchemy模型跨文件关联的Linter兼容性指南
Go App Engine 项目结构与包管理深度指南
苹果SE如何开启单手模式_苹果SE单手操作功能
酷狗音乐多音轨设置教程
驱动人生:游戏修复指南
深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析
《长生:天机降世》火塔小怪大全
iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南
win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】
《kimi智能助手》制作ppt教程
4399小游戏下装链接 4399小游戏下载链接入口
qq音乐官方网站入口_qq音乐在线听歌网页版链接
飞飞漫画漫画阅读官网_飞飞漫画漫画阅读官网进入阅读
mysql触发器如何编写_mysql触发器编写规范与代码示例讲解
英雄联盟争者留名活动介绍
《合金装备4》有望推出重制版!制作人发话了
Animex动漫社社登录官网 Animex动漫社资源社入口直达
微信如何设置字体大小_微信字体设置的阅读舒适
PDF文件去水印平台入口 PDF水印删除网址
qq邮箱怎么注册_QQ邮箱注册步骤与注意事项
TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法
2025-11-01
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。