python : 正确复制列表的方法

Python -复制列表(list)的几种方法 此篇文章记录一下复制列表的各种方法,算是一个总结,也算是自己对知识的巩固。 阅读详情
转自:https://www.cnblogs.com/ifantastic/p/3811145.html
new = old[:]

 

Python老鸟都知道以上代码是什么意思。它复制列表old到new。它对于新手来说是种困惑而且应该避免使用这种方法。不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧。

 

首先我们需要了解Python是如何管理对象和变量。Python没有C语言中的变量。在C语言中,变量不止是个名字,它是字节集合并真实存在于内存某个位置上。而在Python中,变量仅仅是指向对象的标签。

 

看看以下语句:

a = [1, 2, 3]

 

它表示我们创建了一个指引指向列表[1, 2, 3],但是a不是列表。如果:

b = a

 

我们并没有复制a所指引的列表。我们只是创建了一个新的标签b,然后将其指向a所指向的列表。

 

如果你修改a,那你就同时修改了b,因为它们指向同一个列表:

复制代码

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> print a
[1, 2, 3, 4]
>>> print b
[1, 2, 3, 4]

复制代码

 

内建函数id()可以返回对象的唯一id。该id是对象的内存地址。

复制代码

>>> id(a)
3086056
>>> id(b)
3086056
>>> c = [] # Create a new list
>>> id(c)
2946712

复制代码

 

可以看出a和b都指向同一个内存地址。c指向一个新建的空列表,因此指向了不同的地址。

 

现在我们要复制a指引的列表。我们必须创建新的列表,然后使用b指引它。

 

这其实就是 new = old[:]。切片运算符[:]返回一个序列的切片。切片过程是切下列表的一部分,创建新的列表,将切下的部分复制到新列表。

复制代码

>>> a[1:3]
[2, 3]
>>> id(a)
3086056
>>> id(a[1:3])
3063400

复制代码

 

省略第一个索引值,切片从列表开始,省略第二个索引值,切片直到列表末端。

>>> a[:3]
[1, 2, 3]
>>> a[1:]
[2, 3, 4]

 

通过调用a[:],我们得到一个从列表首端开始到末端的切片,也就是a(指引的列表)的完整复制。但这不是复制列表的唯一方式。看看下面这个情况:

>>> b = list(a)
>>> id(a)
3086056
>>> id(b)
3086256

 

这个是不是看起来更好,少一些隐式,更加pythonic?a[:]看起来有点太像Perl。不同于切片标记法,不了解Python的人也会明白b是一个列表。

 

list()是列表构造函数。它会在传入的数列基础上新建一个列表。数列不一定是列表,它可以是任何类型的数列。

复制代码

>>> my_tuple = (1, 2, 3)
>>> my_list = list(my_tuple)
>>> print my_list
[1, 2, 3]
>>> id(my_tuple)
3084496
>>> id(my_list)
3086336

复制代码

 

而且它还接受生成器。切片笔记法不适用于生成器,因为生成器是不可更改。你不能generator[0],例如:

>>> generator = (x * 3 for x in range(4))
>>> list(generator)
[0, 3, 6, 9]

 

百分之九十的切片标记法都可以被list()代替。下次你看见[:]的时候试试使用list()替代,这样可以让你的代码更加可读。记住,魔鬼藏在细节里。

 

附:五种复制方法的比较

复制代码

>>> import copy
>>> a = [[10], 20]
>>> b = a[:]
>>> c = list(a)
>>> d = a * 1
>>> e = copy.copy(a)
>>> f = copy.deepcopy(a)
>>> a.append(21)
>>> a[0].append(11)
>>> print id(a), a
30553152 [[10, 11], 20, 21]
>>> print id(b), b
44969816 [[10, 11], 20]
>>> print id(c), c
44855664 [[10, 11], 20]
>>> print id(d), d
44971832 [[10, 11], 20]
>>> print id(e), e
44833088 [[10, 11], 20]
>>> print id(f), f
44834648 [[10], 20]

复制代码

从以上可以看出,使用 a[:], list(a), a*1, copy.copy(a)四种方式复制列表结果都可以得到一个新的列表,但是如果列表中含有列表,所有b, c, d, e四个新列表的子列表都是指引到同一个对象上。只有使用copy.deepcopy(a)方法得到的新列表f才是包括子列表在内的完全复制。

 

CorelDRAW 2019安装指南:从下载到激活的完整步骤 本文提供了一份详细的CorelDRAW 2019安装指南,涵盖从下载安装包、检查系统环境到完成激活的完整步骤。文章重点解析了安装过程中的关键选项设置,并分享了首次启动后的优化配置与常见问题解决方案,旨在帮助用户高效、顺利地完成这款经典矢量设计软件的安装与配置。 阅读详情

相关推荐

构建自己的哨兵数据集(以sentinel-1为例,使用SNAP软件)

通过欧洲航天官网获取哨兵数据的产品,通过SNAP软件进一步得到SAR图像(以导出图片为例)

xiaoxTai的博客 6181

【列表复制】详解python中list列表复制的几种方法(赋值、切片、copy(),deepcopy())

【列表复制】详解python中list列表复制的几种方法(=、切片、copy(),deepcopy()),浅拷贝、深拷贝、内存地址、嵌套。

程序星空实验室 7897

Python量化入门:用pytdx获取800个交易日K线数据的完整指南(附代码)

本文为Python量化交易初学者提供了使用pytdx库免费获取股票日线级别K线数据的完整指南。文章详细介绍了从环境搭建、单只股票数据获取,到构建健壮的批量下载器、数据清洗与验证,再到基础分析与可视化的全流程,并附有可直接运行的代码示例,帮助读者快速建立本地股票数据库。

weixin_29050513的博客 1462

在Python中列表拷贝的五种方法

1. 引言 在Python中,我们经常会遇到需要拷贝列表的情形,本文针对常用的列表拷贝方法进行介绍和总结,希望可以给大家带来更多感性的认识。 闲话少说,我们直接开始吧。 :) 2. 赋值操作 最容易想到的就是我们可以使用赋值操作来直接复制列表,代码如下: copied_list=original_list 此时,original_list 和copyed_list 都将指向同一个列表对象。举例如下: original_list=[1,2,3] #Copying list using assignment

sgzqc的专栏 1万+

以GD32F103C8T6为例的核心板原理图PCB绘制学习笔记简单总结

重点在supplier part是立创商城的编号,可以搜到。

2301_80397661的博客 3261

微信小程序真机HTTPS证书链失效排查与修复指南

HTTPS证书信任链是保障Web通信安全的基础机制,其核心在于客户端能否通过服务器提供的证书及其上级签发者,逐级回溯至自身预置的可信根证书。在微信小程序场景中,由于客户端不复用系统根证书库,而是采用固化、精简且更新滞后的自研CA白名单,导致大量符合浏览器标准的证书(如Let’s Encrypt新版ISRG Root X1、TrustAsia等)在真机环境下触发net::ERR_CERT_AUTHORITY_INVALID错误。该问题本质是证书链断裂或签名算法/密钥长度不合规,而非域名配置或CORS策略异常。

weixin_33935636的博客 677

[Python] 正确复制列表的方法

new = old[:]   Python老鸟都知道以上代码是什么意思。它复制列表old到new。它对于新手来说是种困惑而且应该避免使用这种方法。不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧。   首先我们需要了解Python是如何管理对象和变量。Python没有C语言中的变量。在C语言中,变量不止是个名字,它是字节集合并真实存在于内存某个位置上...

weixin_34235371的博客 1195

01-认识脑电信号及相关信号的预处理过程

脑电信号处理过程脑电实验为什么要预处理预处理方法降采样如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 脑电实验 本博客主要是记录基于脑电信号的情绪识别方法的研究...

脑机交流者的博客 7658

python 中的六种“复制”方法,Python零基础入门

python 中的六种“复制”方法,Python零基础入门

一名正义的白帽黑客 1万+

实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)

导读 本文主要介绍使用OpenCV对扫描文本矫正的应用实例及详细实现步骤。 背景介绍 在使用打印机或扫描仪扫描文档时,由于摆放位置差异难免造成扫描文档的倾斜。本文将使用OpenCV将倾斜的文档矫正水平并去除黑边。 实现步骤 本文只针对包含大部分文字的文档做倾斜矫正,思路来源是大部分文字倾斜后同一行的也在同一条直线,通过拟合直线计算文本倾斜角度,然后旋转来实现文本倾斜矫正。 详细步骤: ①加载倾斜图像 ②灰度转换+腐蚀+膨胀 ③Canny边缘检测 + 霍夫线变换检测直线 ...

Color Space的博客 3398

第一节:从Chat_Bot 到 AI_Agent——一个范式转换

本文系统剖析了工业级AI代理系统ClaudeCode的设计原理与工程实践。通过对比ChatBot与Agent的三个本质差异:自主循环决策vs单轮应答、环境交互vs纯文本I/O、持久状态管理vs无状态对话,揭示了构建生产级Agent系统的关键挑战。文章详细解析了ClaudeCode的五层架构设计、1800+文件组成的运行时系统,包括工具调度、权限管理、状态持久化等核心机制,并阐述了从简单API调用到完整Agent系统的演进路径。

2201_75869398的博客 67

python 正确复制列表的方法[:]

了解到Python没有c语言的变量,在c语言中,变量不只是一个名字,他是字节集合并且真实存在于内存的的某个位置,而在Python中,变量仅仅指向对象的标签。 new = old[:],它复制列表old到new,它对于新手来说是种困惑而且应该避免使用这种方法。不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧。 a = [1, 2, 3]它表示我们创建了一个指引...

qq_28979491的博客 528

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现

在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 272

list复制_结合实践案例:聊聊Python正确复制列表的方法

内容原文:https://www.cnblogs.com/ifantastic/p/3811145.html创作者:iFantasticMenew = old[:]Python老鸟都知道以上new = old[:]代码是什么意思,不过对于新手来说却是种困惑,并且还应该尽量避免这种方法的使用。不幸的是[:]标记法被广泛使用,不过也有可能是因为Python程序员不知道更好的列表复制法吧。接下...

weixin_39536427的博客 97

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python列表的复制

python中列表的复制熟悉python的朋友都知道,与其说在python中给变量赋值,倒不如说是给值贴标签。 为什么这么说,因为当我使用诸如 a = b 这种操作时,python并没有为把b的复制给a,而是把a这个标签贴在了b标签贴在的变量上。 那么当我有一个列表,我想修改它并产生一个副本但是却不改变原来的列表的时候,就必须去复制列表。 我举个反例:a = ['0', '1' ,'2', '

geeeeek_xuan博客 916

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python用for循环remove列表中所有元素时容易踩的坑

假设有一个列表是[a,b,c,d,e,f],想用for循环remove里面所有的元素。我们可能会想写成以下代码: lst=['a','b','c','d','e','f'] for i in lst: lst.remove(i) print(lst) 以上代码看起来没什么问题,运行也不会报错。但是结果并不是我们期待的空列表[],而是['b', 'd', 'f']。 只删除了一半的元...

weixin_44520259的博客 4233

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python关于list的复制问题

正确方法: lst = [11,22,33,44,55] lst1 = lst[:] # one way lst2 = list(lst) # another lst3 = copy.deepcopy(lst) 如果lst中还有list类型变量,需要用copy.deepcopy 错误方法: lst = [11,22,33,44,55] lst3 = lst list不能...

AlwaySimple的博客 395

python当中如何克隆一个列表

How to clone or copy a list?【python】正确复制列表的方法b = a   #这种情况是将a和b放在同一个引用上了,不算是copyb = a.copy()  #这个方法和下面的三个方法,虽然id(b) != id(a),但是里面的对象id是一样的b = a[:]b = list(a)b = copy(a)   b = copy.deepcopy(a)  #只有这种方法...

我的博客 4590

Python上课笔记4:操作列表

4-1 披萨 food = ['a' , 'b' , 'c'] for pizza in food : print(pizza) print("i really like pizza!") a b c i really like pizza! [Finished in 0.9s] 4-6奇数 #4-6:本题主要考察的是range()函数的...

Aa545620073的博客 320

python 利用for循环遍历list列表删除元素时的报错 原理 及注意事项 IndexError: list index out of range

python 有关列表删除元素 for循环遍历 出错 原理 情况分析

weixin_65922074的博客 2033

Python 创建二维列表(数组矩阵),以及易错的方式

正确的方式 通过嵌套for循环,一个个添加0 n = [] for i in range(2): n.append([]) for j in range(3): n[i].append(0) n[0][0] = 2 print(n) 输出[[2, 0, 0], [0, 0, 0]] 错误的方式 创建一个三个0的一位数组,将该数组复制两倍 m = [0]*3 mm = [m]*2 mm[0][0] = 2 print(mm) 输出[[2, 0, 0...

zhr1030635594的博客 2645

Python:第6天:列表与元组 —— 批量管理数据

本文系统介绍了Python中列表和元组的基本概念及操作方法。主要内容包括:列表的创建、访问(索引和切片)、修改、增删操作(append/insert/pop/remove等)、查询(in/index/count)和遍历(for循环);元组的不可变特性、创建访问方法及与列表的区别;常用函数如len/sum/max/min/sort等;列表复制陷阱及正确方法。通过学生成绩管理系统示例,演示了列表的综合应用。文章强调列表适用于可变数据,元组适用于固定数据,并指出了新手常见错误及解决方法。

天佑木枫 221

Python正确复制列表的方法

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。返回一个序列的切片。基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

2401_84584763的博客 832

python 复制列表的六种方法

以下是对列表的六种复制方式,总结来说在复制时有三种原理,其中 l1l1l1 是一种,l6l6l6 是第二种,其他的四个方法属于第三种。 import copy l = [1, 2, [3, 4]] l1 = l l2 = l.copy() l3 = l[:] l4 = list(l) l5 = copy.copy(l) l6 = copy.deepcopy(l) 我们可以先来打印它们的地址: p...

cocofisher的博客 8377

python 正确复制列表的方法

正确复制列表方法 new = old[:] Python老鸟都知道以上代码是什么意思。它复制列表old到new。它对于新手来说是种困惑而且应该避免使用这种方法。不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧。 容易遇到的坑 新手可能是从java等过来学习python的,会自然而然使用以下这种复制方法,但实际上这是不正确的。 new = old 首先我们需要了解Python是如何管理对象和变量。Python没有C语言中的变量。在C语言中,变量不止是个名字,它是字节集合并真

weixin_44217936的博客 878

Python——正确复制列表的方法

Python老鸟都知道以上代码是什么意思。它复制列表old到new。它对于新手来说是种困惑而且应该避免使用这种方法。不幸的是[:]标记法被广泛使用,可能是Python程序员不知道更好的列表复制法吧。

m0_72557783的博客 772
上一篇: pytorch 与 numpy 的相互转换
下一篇: 【干货】深度学习实验流程及PyTorch提供的解决方案
wzg2016
博客等级 码龄10年 539粉丝 493原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值