Python列表浅拷贝的陷阱与破解之道

news2024/11/16 15:40:17

在这里插入图片描述

引言

在Python编程世界中,列表的拷贝操作看似简单,却常常隐藏着一些令人意想不到的陷阱,尤其是当涉及到浅拷贝时。今天,我们将深入探讨Python列表浅拷贝现象及产生原因,并提供有效的解决方案,帮助你写出更稳定、更健壮的代码。

在这里插入图片描述

一、现象与产生原因

当你对一个列表进行浅拷贝后,若原列表中包含可变对象(如列表、字典等),修改这些可变对象会影响到浅拷贝的列表。这源于浅拷贝的本质:它只复制了列表的第一层元素。对于嵌套的可变对象,浅拷贝只是复制了对象的引用,而非创建新的对象。因此,原列表和浅拷贝列表中的可变对象实际上是同一个对象。

示例代码

original_list = [1, 2, 3, [4, 5]]
shallow_copy = original_list.copy()

original_list[3][0] = 'a'
print(shallow_copy)  # 输出:[1, 2, 3, ['a', 5]]

在上述示例中,修改原列表中的子列表 [4, 5] 的第一个元素,浅拷贝列表中的相应子列表也被修改。这是因为原列表和浅拷贝列表共享子列表的引用。

在这里插入图片描述

二、解决方案

方法 1:每次生成新的列表

对于简单数据类型或不可变对象,确保每次生成一个新的列表对象即可避免引用问题。

示例代码

# 初始化 extract_arr
extract_arr = []

# 示例数据
combined_data = [1, 2, 3]

# 第一次添加
extract_arr.append(combined_data.copy())

# 修改 combined_data
combined_data = [4, 5, 6]

# 第二次添加
extract_arr.append(combined_data.copy())

print("Extracted Array:", extract_arr)

方法 2:使用深拷贝

对于复杂结构或嵌套的可变对象,使用深拷贝来生成全新的对象,是避免引用问题的有效手段。

示例代码

import copy

# 初始化 extract_arr
extract_arr = []

# 示例数据
data_points = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 循环添加数据
for data in data_points:
    extract_arr.append(copy.deepcopy(data))

print("Extracted Array:", extract_arr)

输出:

Extracted Array: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

在这里插入图片描述

三、完整示例

假设你在一个循环中,每次需要添加新的数据到 extract_arr 中,使用深拷贝可以确保数据的独立性和完整性。

import copy

# 初始化 extract_arr
extract_arr = []

# 示例数据
data_points = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 循环添加数据
for data in data_points:
    extract_arr.append(copy.deepcopy(data))

print("Extracted Array:", extract_arr)

输出:

Extracted Array: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

在这里插入图片描述

总结

  • 每次生成新的列表:对于简单数据类型或不可变对象,使用 .copy() 方法生成一个新的列表对象。
  • 使用深拷贝:对于复杂结构或嵌套的可变对象,使用 copy.deepcopy 生成全新的对象。

掌握这些技巧,你将能避免Python列表拷贝时的常见陷阱,写出更安全、更高效的代码。

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

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

相关文章

Mysql Innodb存储引擎原理—链接如下

Mysql Innodb存储引擎| ProcessOn免费在线作图,在线流程图,在线思维导图 ProcessOn是一个在线协作绘图平台,为用户提供强大、易用的作图工具!支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同…

Excel--复制粘贴时怎么跳过隐藏的行和列

方法一 比如如何跳过下面的行复制其他 首先将黄色的背景行按CTRL0隐藏起来 打开定位条件 选择可见单元格,点击确定 然后复制表格粘贴即可 方法二 首先将不需要的行和列隐藏起来,按Alt;锁定可见单元格。 复制粘贴即可,这样粘贴的…

解锁编程潜力,从掌握GitHub开始

目录: 一、搜索开源项目 1、什么是Git 2、Github常用词含义 3、一个完整的项目界面 4、使用Github搜索项目 1)in关键词 2)star或fork数量去查找 3)awesome加强搜索 二、访问速度慢的解决 1、使用网易UU加速器 2、使用…

redisservice jsonobect 转list

redis里存的是json&#xff0c;但是json的格式是list 怎么取出来呢 JSONArray cacheObject (JSONArray) redisService.getCacheObject("sys_dict:dispute_data_source_hn");Class<SysDictData> sysDictDataClass SysDictData.class;List<SysDictData>…

日历时钟怎么设置?桌面日历时钟设置方法

大家好&#xff0c;今天小编给大家介绍一下&#xff0c;日历时钟怎么设置&#xff1f;桌面日历时钟设置方法 第一&#xff1a;先安装《芝麻时钟》这个桌面时钟软件&#xff0c;这个桌面时钟软件非常的强大&#xff0c;可以在桌面显示各种各样的时钟&#xff0c;各种时钟风格大…

ubuntu20.04搭建vue开发环境

1、当前系统版本 cat /etc/issue 2、nodejs安装 sudo apt install nodejs 查看nodejs版本 3、npm安装 sudo apt install npm 查看npm版本 npm -v 4、Vue安装 sudo npm install -g vue-cli 查看版本和是否安装成功 5、创建vue项目 sudo vue init webpack vuedemo 6、运行…

C++之数据类型

//宏常量define&#xff08;注意书写格式&#xff09; #define a 7 //const修饰变量 const int b 365; 命名规则 数据类型之整型&#xff1a; sizeof&#xff08;&#xff09;&#xff1a;求数据类型所占空间大小&#xff0c;字节数 数据类型之实型&#xff08;浮点数&#…

如何使用命令行快速下载Google Drive/OneDrive大文件

OneDrive OneDrive使用wget下载会出现403 forbidden&#xff0c;可通过下面方法下载。 浏览器右键进入检查界面&#xff0c;选择netowork&#xff0c;搜索download.aspx&#xff0c;然后在待下载文件处点击下载&#xff0c;即可出现下载链接&#xff0c;复制为cURL即可下载。…

STM32 之 SDRAM 详解

目录 前言 一、SDRAM 简介 二、SDRAM的组成原理 2.1存储单元阵列 2.1.1地址译码 2.1.2存储电容 2.2控制逻辑 2.2.1时钟同步 2.2.2命令解码 2.2.3模式寄存器 2.3数据输入 / 输出缓冲 2.3.1数据总线 2.3.2数据锁存 2.4刷新电路 2.4.1自动刷新 2.4.2自刷新 三、S…

Parsec问题解决方案

Parsec目前就是被墙了&#xff0c;有解决方案但治标不治本&#xff0c;如果想稳定串流建议是更换稳定的串流软件&#xff0c;以下是一些解决方案 方案一&#xff1a;在%appdata%/Parsec/config.txt中&#xff0c;添加代理 app_proxy_address 127.0.0.1 app_proxy_scheme http…

每日OJ_牛客_乒乓球筐(字符串模拟)

目录 牛客_乒乓球筐&#xff08;简单模拟&#xff09; 解析代码 牛客_乒乓球筐&#xff08;简单模拟&#xff09; 乒乓球筐__牛客网 nowcoder有两盒&#xff08;A、B&#xff09;乒乓球&#xff0c;有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类&a…

Win10安装.net FrameWork3.5失败解决方法

win10安装.net FrameWork3.5失败解决方法 已经好久没有来投稿了,实在最近业务缠身,忙的焦头烂额(呵~多么伟大的牛马) 但最近开发使用windows11实在是拉胯的不行,升级完就后悔,所以就一怒之下,重装了win10 可是,好家伙,我重装完遇到一个问题,就是在使用.Net Framework3.5,按照Mi…

GB28181规范中broadcast和talk模式实际场景时间差别在哪里?

好多开发者对GB28181规范里面&#xff0c;broadcast和talk模式区分不清&#xff0c;今天借此机会&#xff0c;针对GB28181标准中的Broadcast&#xff08;广播&#xff09;和Talk&#xff08;对讲&#xff09;是两种不同的通信模式&#xff0c;它们在视频监控系统中扮演着不同的…

Javaweb项目实现文件导出功能

在我的项目中&#xff0c;我将模糊查询与文件导出结合使用&#xff0c;实现下载前端列表展示的数据到本地 导入maven坐标 <!--导出为表需要--> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version&…

算法知识点————双指针【删除重复元素】【反转链表】

删除重复元素 题目&#xff1a;//给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数 思路&#xff1a…

CleanClip for mac(苹果电脑剪切板管理器)

CleanClip 是一款为 Mac 设计的强大剪贴板管理工具&#xff0c;它能够显著提升你的工作效率和生产力。无论是在日常办公中还是进行创意设计&#xff0c;CleanClip 都能帮助你更轻松地管理和使用剪贴板内容。让我们一起来探索一下这个功能丰富的软件吧&#xff01; 下载地址&am…

常见文档工具对比和选择

前言 文档工具的本质&#xff0c;其实都是将我们的文档内容标准化&#xff0c;在互联网环境上的文档&#xff0c;一般目前比较主流的是生成文档的 html 网页内容&#xff0c;而文档内容的作者都比较倾向于使用纯文本的 Markdown 进行书写&#xff0c;所以文档工具的核心内容主要…

蒙特卡罗方法——布丰投针实验近似计算圆周率python代码实现

布丰实验 数学原理 python代码 import random as rd import numpy as np import math import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.family] SimHei # 或者 Microsoft YaHei matplotlib.rcParams[axes.unicode_minus] False # 解决负号- …

标签的ref属性

标签的ref属性 当我们想要获取一个标签对应的 DOM 元素的时候在 JavaScript 中&#xff0c;我们通过 document.getElementById() 来借助类选择器的写法获取&#xff0c;但是在 Vue 中&#xff0c;我们的 DOM 元素是挂载在同一个网页上的&#xff0c;这些名称难免会重复&#x…

《计算机算法设计与分析》笔记

第一章 算法概述 1.1算法性质&#xff1a; 输入、输出、确定性、有限性 1.2时间复杂度 上界记号O&#xff1a;如果存在正的常数C和自然数N0&#xff0c;使得当N≧N0时有f(N)≦Cg(N)&#xff0c;则f(N)有上界函数g(N)&#xff0c;记为f(N) O(g(N))。 同阶记号θ&#xff1a;…