【python笔记】列表操作append(list)与append(list[:])的区别;列表的就地修改与非就地修改

server/2024/12/22 18:26:12/

问题背景:

当有一个数组list1 = [1,2,3],需要根据list1创建一个二维数组list2时,

想到了列表的list2.append(list1)

结果由于list1.pop()更改,list2的结果也随之变化,开始摸不着头脑。

append(list)与append(list[:])的区别

append(list)

执行list2.append(list1)时,实际上是list1列表的引用添加到了list2中。

意味着,list2列表中的元素与list1列表指向同一个对象;

因此,在对list1进行就地修改操作修改list1时,修改便反馈在list2上。

当然,如果对list1进行的是非就地修改操作,list2结果并不会受到影响。

list1 = [1, 2, 3]  
list2 = []  
# 添加list1的引用  
list2.append(list1)  
# 现在,list2和list1 都指向同一个列表  
print(list2)  # 输出: [[1, 2, 3]]    
# 修改list1 
list1.append(4)  
# list2中的元素也被修改了,因为它们指向同一个列表  
print(list2)  # 输出: [[1, 2, 3, 4]]  

append(list[:])

执行list2.append(list1[:])时,实际上创建了一个list1列表的浅拷贝,并将这个浅拷贝的引用添加到list2中。

意味着,list2中的元素是一个新列表,与list1在内存中占有不同的位置;

因此,无论对list1进行何种操作,均不会影响list2。

# 添加list1的浅副本  
list2.append(list1[:])  
# 现在,res和path指向不同的列表  
print(list2)  # 输出: [[1, 2, 3]]  
# 修改list1
list1.append(4)  
# list2中的元素没有改变,因为它们是独立的列表  
print(list2)  # 输出: [[1, 2, 3]]

就地修改与非就地修改的区别

刚才有提到就地修改和非就地修改的说法,到底何为列表的就地修改?何为非就地修改呢?

非就地修改(Non-in-place Modification)

创建原始数据的一个新副本,并在该副本上进行修改,而原始数据保持不变。

常见操作:

1、切片复制新变量

original = [1, 2, 3]  
modified = original[:]  # 浅拷贝  
modified.append(4)  # 修改新列表,原始列表不变

2、列表推导式

original = [1, 2, 3, 4, 5]  
modified = [x * 2 for x in original]  # 创建新列表,每个元素都是原始元素的两倍

3、map()filter()函数

original = [1, 2, 3, 4, 5]  
modified = list(map(lambda x: x * 2, original))  # 每个元素乘以2
print(modified)     # 输出:[2, 4, 6, 8, 10]filtered_iter = filter(lambda x: x > 3, original)
# filter()返回的是一个迭代器,因此我们需要将它转换成列表或其他数据结构来查看结果  
filtered_list = list(filtered_iter) 
print(filtered_list)  # 输出: [4, 5]

4、列表的+操作符

list1 = [1, 2, 3]  
list2 = [4, 5, 6]  
combined = list1 + list2  # 合并成新列表

就地修改(In-place Modification)

直接修改原始数据,不会创建新的数据副本。

常见操作:

1、append()、pop()、remove()、insert()、sort()、reverse()等直接修改列表本身的方法

2、切片赋值

list1 = [1, 2, 3, 4, 5]  
list1[1:3] = [20, 30]  # 直接替换列表中的一部分

3、__setitem__特殊方法

这不是日常编程中常用的方法,但它是Python中所有可变序列类型(如列表)支持的就地修改机制的一部分。

my_list = [1, 2, 3]  
my_list.__setitem__(1, 10)  # 直接设置索引为1的元素为10


http://www.ppmy.cn/server/122255.html

相关文章

前端文件下载全流程

一、首先是点击下载函数功能 源代码: java const dow async (record: any) > {console.log(record,record);let date: any {}date.pcno record.pcnodate.fileName record.fileNamedate.gmtCreated dayjs(record.gmtCreated).format(YYYY-MM)date.importSta…

解决docker目录内存不足扩容处理

当我们使用docker时,经常会创建新镜像和新容器,在新容器中又会安装各种包,这些东西不是虚拟的,而是实实在在存于我们的磁盘中,默认在/var/lib/docker中,这个目录是属于系统盘的,而系统盘的空间往…

接口自动化测试框架详解(pytest+allure+aiohttp+ 用例自动生成)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效…

【计算机网络】运输层协议解析

这里写目录标题 前言UDP与TCP对比TCP流量控制TCP拥塞控制TCP超时重传时间选择TCP可靠传输实现 前言 运输层直接为应用进程间的逻辑通信提供服务。运输层向高层用户屏蔽了下面网络核心细节(如网络拓扑、路由选择协议等)它使应用进程看见的就好像是在两个…

IP地址与智能家居能够碰撞出什么样的火花呢?

感应灯、远程遥控空调,自动感应窗帘——智能家居已经在正逐步走入我们的生活,为我们带来前所未有的便捷与舒适体验。而在这一进程中,IP地址又能够与智能家居碰撞出什么样的火花呢? 一、IP地址:智能家居的连接基石 智…

0基础学习HTML(二十二)XHTML

HTML - XHTML XHTML 是以 XML 格式编写的 HTML。 什么是 XHTML? XHTML 指的是可扩展超文本标记语言XHTML 与 HTML 4.01 几乎是相同的XHTML 是更严格更纯净的 HTML 版本XHTML 是以 XML 应用的方式定义的 HTMLXHTML 是 2001 年 1 月发布的 W3C 推荐标准XHTML 得到所有主流浏览器…

Html--笔记01:使用软件vscode,简介Html5--基础骨架以及标题、段落、图片标签的使用

一.使用VSC--全称:Visual Studio Code vscode用来写html文件,打开文件夹与创建文件夹:①选择文件夹 ②拖拽文件 生成浏览器的html文件的快捷方式: !enter 运行代码到网页的方法: 普通方法&#xff1a…

【学习笔记】手写 Tomcat 四

目录 一、Read 方法返回 -1 的问题 二、JDBC 优化 1. 创建配置文件 2. 创建工具类 3. 简化 JDBC 的步骤 三、修改密码 优化返回数据 创建修改密码的页面 注意 测试 四、优化响应动态资源 1. 创建 LoginServlet 类 2. 把登录功能的代码放到 LoginServlet 类 3. 创…