【Python】由二维列表初始化导致修改元素时会修改相同位置元素的引用问题f = [[0] * len(matrix[0])] * len(matrix)

背景:

在刷Leetcode过程中,需要初始化一个与另一个矩阵(如 matrix)尺寸相同的二维列表(如 f),并填充初始值(如 0)。一开始用的是这种方法试图创建一个所有元素均为 0 的二维列表:

f = [[0] * len(matrix[0])] * len(matrix)

这段代码旨在生成一个与 matrix 维度相同的矩阵 f。虽然从表面上看这段代码似乎实现了目标,但实际运行中会出现意想不到的问题。

遇到的问题:

原理是代码中 f 矩阵的所有行都引用了同一个列表对象。结果是,当修改 f 中某一行的某个元素时,所有行相同位置的元素都会同步发生变化。问题的核心原因在于 Python 中的列表引用机制

  • 示例:
matrix = [[100, -42, -46, -41], [31, 97, 10, -10], [-58, -51, 82, 89], [51, 81, 69, -51]]
f = [[0] * len(matrix[0])] * len(matrix)f[0][0] = 1
print(f)
  • 输出:
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

如上所示,修改 f[0][0] 的值会导致所有行的第一个元素同步更新。这是因为所有行实际上引用的是同一个列表对象

问题的原因:

[[0] * len(matrix[0])] * len(matrix) 这段代码中,[0] * len(matrix[0]) 生成了一行包含 len(matrix[0]) 个元素的列表。随后,* len(matrix) 只是将同一个列表引用多次复制,导致每一行都是同一个列表的引用。如果查看他的地址的话会发现每个每一行所存储的数据地址是同一个。因此,任何对某一行元素的修改都会影响其他所有行相同位置

  • 查看物理地址
matrix = [[100, -42, -46, -41], [31, 97, 10, -10], [-58, -51, 82, 89], [51, 81, 69, -51]]
f = [[0] * len(matrix[0])] * len(matrix)print(id(f[0]))
print(id(f[1]))
print(id(f[2]))
print(id(f[3]))

实验的结果也表明存到了相同的物理地址

实验结果

应对方案:

要解决这个问题,我们需要确保每一行都是独立的列表,而不是对同一个列表的引用。我们可以使用列表推导式初始化二维列表:

f = [[0] * len(matrix[0]) for _ in range(len(matrix))]

这种方法通过 for 循环,每次都生成一个新的列表。这样,每一行都是一个独立的对象,修改某一行不会影响其他行。

示例:

  • 实验代码
matrix = [[100, -42, -46, -41], [31, 97, 10, -10], [-58, -51, 82, 89], [51, 81, 69, -51]]
f = [[0] * len(matrix[0]) for _ in range(len(matrix))]
#使用列表推导式来初始化二位列表f[0][0] = 1
print(f)
  • 输出:
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

现在,修改 f[0][0] 只会影响第一行,其他行不会被改变。

总结:

在初始化二维列表时,直接使用 [[0] * n] * m 的方式会导致所有行引用同一个列表对象。这种行为在修改二维列表中的元素时会造成每一行的列表会存储到相同的物理地址

解决该问题的最佳方法是使用列表推导式生成独立的行对象,确保每一行都是互相独立的,从而避免修改一个元素时影响其他元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django自用教程

编程软件: pycharm django介绍:django是Pythonweb的一个框架,是用来构建网站的工具。 要想使用django,首先需要下载django模块,通过使用以下代码实现: pip install django 安装完成后,在django的目录下有一个文件django-admin&am…

docker基础知识-docker0网桥

文章目录 示意图Docker 网桥的工作原理Docker 网桥的优势Docker 网桥的局限性自定义网桥网络 Docker 网桥(Docker bridge network)是 Docker 默认的一种网络模式,它允许 Docker 容器之间通过一个虚拟的交换机进行通信。Docker 网桥网络为容器…

Linux shell编程学习笔记79:cpio命令——文件和目录归档工具(下)

在 Linux shell编程学习笔记78:cpio命令——文件和目录归档工具(上)-CSDN博客https://blog.csdn.net/Purpleendurer/article/details/142095476?spm1001.2014.3001.5501中,我们研究了 cpio命令 的功能、格式、选项说明 以及 cpi…

计算机视觉的应用32-基于Swin Transformer模型的嵌入混合注意力机制的人脸表情识别的应用

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用32-基于Swin Transformer模型的嵌入混合注意力机制的人脸表情识别的应用。随着深度学习技术的不断演进,计算机视觉领域迎来了诸多变革,其中 Transformer 架构的引入&#xf…

verilog vscode 与AI 插件

Verilog 轻量化开发环境 背景 笔者常用的开发环境 VIAVDO, 体积巨大,自带编辑器除了linting 能用,编辑器几乎不能用,仿真界面很友好,但是速度比较慢。Sublime Text, 非常好用的编辑器,各种插件使用verilog 非常方便…

sqlite在Windows环境下安装、使用、node.js连接

sqlite在Windows环境下安装、使用、node.js连接 前言:2024年9月10日 1. 下载安装 sqlite 的安装非常简单 去官网下载对应压缩包 将两个压缩包解压,并将解压出来的文件放在同一目录下 将上面的目录路径配置到环境变量 path 中 2. 执行 sql sqlite …

opencv羊群计数,动态目标检测跟踪

OpenCV(开源计算机视觉库)是一个功能强大的计算机视觉和图像处理库,广泛应用于各种视觉任务中,包括但不限于目标检测与跟踪。如果你正在考虑一个基于OpenCV的羊群计数项目,那么下面是对这样一个项目的概述:…

ThinkPHP Email功能如何配置才能发送邮件?

ThinkPHP Email发送流程?使用ThinkPHP发Email方法? ThinkPHP作为一款流行的PHP框架,提供了强大的Email功能,使得开发者能够轻松实现邮件发送。AokSend将详细介绍如何配置ThinkPHP Email功能,以确保邮件能够顺利发送。…

计算机毕业设计 智能推荐旅游平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

暴雨液冷服务器硬刚液冷放量元年

AI(人工智能)不断向前,作为AI三驾马车之一,算力需求始终如影随形。 近日,财经记者走访了河南郑州多家服务器厂商、大模型公司和算力中心。在走访中,记者发现,液冷技术正被算力行业青睐&#xf…

直播相关02-录制麦克风声音,QT 信号与槽,自定义信号和槽

一 信号与槽函数 #include "mainwindow.h" #include <QPushButton> #include <iostream> using namespace std;//我们的目的是在 window中加入一个button&#xff0c;当点击这个button后&#xff0c;关闭 MainWindow 。 MainWindow::MainWindow(QWidget …

0.3 学习Stm32经历过的磨难

文章目录 用库函数传参 能否按位或STM32库函数XXX_GetFlagStatus和XXX_GetITStatus的区别关于MDK导入文件后报错 Browse information of one files is not available用exti中断读取按键 忘记消抖 &#xff08;更离谱的是&#xff0c;我忘记开启afio的时钟了 Damn!&#xff09;D…

【Lua学习】Lua入门

上一篇帖子【Lua学习】Lua最最基础的 – 经云的清净小站 (skycreator.top)讲了Lua是什么&#xff0c;Lua如何安装在Linux和Windows上。那么安装好之后&#xff0c;我们就要使用Lua实现我们的各种功能了。 首先&#xff0c;我们要先了解Lua一些最基本的内容&#xff0c;比如怎么…

攻防世界 Web_php_unserialize

Web_php_unserialize PHP反序列化 看看代码 <?php class Demo { private $file index.php;public function __construct($file) { $this->file $file; }function __destruct() { echo highlight_file($this->file, true); }function __wakeup() { if ($this->…

【QT】自制一个简单的时钟(跟随系统时间)

目录 源代码&#xff1a; 输出结果如下&#xff1a; 使用QT完成一个简单的时钟图形化界面&#xff0c;功能是完成了时分秒指针能够跟随系统时间移动 设计思路&#xff1a; 1、首先将时钟的边框绘制出来 2、定义出一个定时器t1&#xff0c;将定时器连接到update_slot槽内&#…

supervisor安装CeSi集中化管理Supervisor

一、安装supervisor 备注&#xff1a;supervisor 只能管理前台进程的服务&#xff0c;比如 npm run 这些 &#xff0c;一些后台运行的服务无法管理【后台运行的服务可以用systemd 进行管理】 1、安装epel源 yum install epel-release yum install -y supervisor 2、创建sup…

比较stl库的ostringstream与Qt的QString::arg(),QString::number()

需求&#xff1a; 显示一个float或者double类型的数&#xff0c;要求小数点后的数字位数为定值。 考虑STL库的ostringstream或者Qt的QString::arg(), number 对于stringstream,使用比较繁琐&#xff0c;要联合使用std::fixed和std::setprecision才能实现固定小数位数显示&am…

[论文笔记]QLoRA: Efficient Finetuning of Quantized LLMs

引言 今天带来LoRA的量化版论文笔记——QLoRA: Efficient Finetuning of Quantized LLMs 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 我们提出了QLoRA&#xff0c;一种高效的微调方法&#xff0c;它在减少内存使用…

C语言深入理解指针五(18)

文章目录 前言一、回调函数是什么&#xff1f;二、qsort使用举例使用qsort函数排序整型数据使用qsort函数排序结构数据 三、qsort的模拟实现总结 前言 本篇将会很有意思&#xff01; 一、回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。   如果你把函数…

C++——STL——栈(stack)

栈的定义 栈 &#xff08; stack &#xff09;是限定仅在表的一端进行插入和删除操作的线性表&#xff0c;允许插入和删除的一端称 为栈顶&#xff0c;另一端称为栈底&#xff0c;不含任何数据元素的栈称为空栈。 栈的示意图 因为栈只能够在一端进行插入和删除&#xff0c;所以…