四种实现方式实现Python浅拷贝

Python对象拷贝:浅拷贝与深拷贝详解 在Python编程中,对象拷贝是处理可变数据结构时的核心概念。浅拷贝(copy.copy)创建新容器但共享内部引用,适用于单层数据结构;深拷贝(copy.deepcopy)递归复制整个对象图,确保完全独立。理解这两种拷贝机制对于避免意外的引用共享至关重要,特别是在处理嵌套列表、字典等可变对象时。实际开发中,配置管理、函数参数传递等场景都需要合理选择拷贝策略。本文通过典型代码示例,剖析Python的引用机制与拷贝实现原理,帮助开发者掌握对象复制的正确方法,提升代码的健壮性与性能。 阅读详情

方式一:使用切片 [:]

列表

# 浅拷贝 [:]
old_list = [1, 2, [3, 4]]
new_list = old_list[:]

old_list.append(5)
old_list[2][0] += 97

print("Old list:", old_list, "old list id:", id(old_list), " old list[0] id:", id(old_list[2]))
print("new list:", new_list, "new list id:", id(new_list), " new list[0] id:", id(new_list[2]))


# 输出结果
Old list: [1, 2, [100, 4], 5] old list id: 4537660608  old list[0] id: 4537659840
new list: [1, 2, [100, 4]] new list id: 4537711424  new list[0] id: 4537659840

方式二:使用工厂函数

工厂函数简介

  • 工厂函数看上去像函数,但实际是一个类
  • 调用时,生成该数据类型类型的一个实例

可变对象的工厂函数

  • list()
  • set()
  • dict()

列表

# 浅拷贝 工厂函数
old_list = [1, 2, [3, 4]]
new_list = list(old_list)

old_list.append(5)
old_list[2][0] += 97

print("Old list:", old_list, "old list id:", id(old_list), " old list[0] id:", id(old_list[2]))
print("new list:", new_list, "new list id:", id(new_list), " new list[0] id:", id(new_list[2]))

集合

# 浅拷贝 工厂函数-集合
old_set = {1, 2, 3}
new_set = set(old_set)

old_set.add(4)

print("Old set:", old_set, "old set id:", id(old_set))
print("new set:", new_set, "new set id:", id(new_set))


# 输出结果
Old set: {1, 2, 3, 4} old set id: 4484723648
new set: {1, 2, 3} new set id: 4484723872 

字典

# 浅拷贝 工厂函数-字典
old_dict = {"name": "小菠萝"}
new_dict = dict(old_dict)

old_dict["second"] = "测试笔记"

print("Old dict:", old_dict, "old dict id:", id(old_dict))
print("new dict:", new_dict, "new dict id:", id(new_dict))


# 输出结果
Old dict: {'name': '小菠萝', 'second': '测试笔记'} old dict id: 4514161536
new dict: {'name': '小菠萝'} new dict id: 4515690304

方式三:使用数据类型自带的 copy 方法

列表

# 浅拷贝 自带的copy方法-列表
old_list = [1, 2, [3, 4]]
new_list = old_list.copy()

old_list.append(5)
old_list[2][0] += 97

print("Old list:", old_list, "old list id:", id(old_list), " old list[0] id:", id(old_list[2]))
print("new list:", new_list, "new list id:", id(new_list), " new list[0] id:", id(new_list[2]))


# 输出结果
Old list: [1, 2, [100, 4], 5] old list id: 4309832000  old list[0] id: 4310372992
new list: [1, 2, [100, 4]] new list id: 4309735296  new list[0] id: 4310372992 

集合

# 浅拷贝 自带的copy方法-集合
old_set = {1, 2, 3}
new_set = old_set.copy()

old_set.add(4)

print("Old set:", old_set, "old set id:", id(old_set))
print("new set:", new_set, "new set id:", id(new_set))


# 输出结果
Old set: {1, 2, 3, 4} old set id: 4309931392
new set: {1, 2, 3} new set id: 4309930944

字典

# 浅拷贝 自带的copy方法-字典
old_dict = {"name": "小明"}
new_dict = old_dict.copy()

old_dict["second"] = "python"

print("Old dict:", old_dict, "old dict id:", id(old_dict))
print("new dict:", new_dict, "new dict id:", id(new_dict))


# 输出结果
Old dict: {'name': '小明', 'second': 'python'} old dict id: 1611676464896
new dict: {'name': '小明'} new dict id: 1611676464960

源码

def copy(self, *args, **kwargs): # real signature unknown
    """ Return a shallow copy of the list. """
    pass

已经写的很清楚,这是浅拷贝

方式四:使用 copy 模块的 copy 方法

列表

# 浅拷贝 copy模块的copy方法-列表
from copy import copy

old_list = [1, 2, [3, 4]]
new_list = copy(old_list)

old_list.append(5)
old_list[2][0] += 97

print("Old list:", old_list, "old list id:", id(old_list), " old list[0] id:", id(old_list[2]))
print("new list:", new_list, "new list id:", id(new_list), " new list[0] id:", id(new_list[2]))


# 输出结果
Old list: [1, 2, [100, 4], 5] old list id: 4381013184  old list[0] id: 4381159936
new list: [1, 2, [100, 4]] new list id: 4381012800  new list[0] id: 4381159936

集合

# 浅拷贝 copy模块的copy方法-集合
from copy import copy

old_set = {1, 2, 3}
new_set = copy(old_set)

old_set.add(4)

print("Old set:", old_set, "old set id:", id(old_set))
print("new set:", new_set, "new set id:", id(new_set))


# 输出结果
Old set: {1, 2, 3, 4} old set id: 4381115552
new set: {1, 2, 3} new set id: 4381115776

字典

# 浅拷贝 copy模块的copy方法-字典
from copy import copy

old_dict = {"name": "小明"}
new_dict = copy(old_dict)

old_dict["second"] = "python"

print("Old dict:", old_dict, "old dict id:", id(old_dict))
print("new dict:", new_dict, "new dict id:", id(new_dict))


# Python小白学习交流群:153708845
# 输出结果
Old dict: {'name': '小明', 'second': 'python'} old dict id: 3220382234368
new dict: {'name': '小明'} new dict id: 3220382234432
Python 列表专题:深浅拷贝 浅拷贝是指创建一个新的对象,但新的对象中包含的元素仍然是对原有元素的引用。换句话说,浅拷贝只复制了对象的最外层结构,而对嵌套的对象引用并不进行复制。# 修改原列表的嵌套列表print("Original List:", original_list) # 输出: [1, 2, ['Changed', 4]]print("Shallow Copied List:", shallow_copied_list) # 输出: [1, 2, ['Changed', 4]]在这个例子中,中的嵌套列表依然引用的是。 阅读详情

相关推荐

Python教程:一文了解Python的深拷贝与浅拷贝

理解 Python 中的深拷贝(deep copy)和浅拷贝(shallow copy)是非常重要的,特别是在处理嵌套结构的数据时。让我们深入探讨这两个概念,并通过代码示例进行说明。

旦莫的博客 3969

Python 深拷贝和浅拷贝详解

Python深拷贝和浅拷贝详解 浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。 深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。 1.浅拷贝 使用数据类型本身的构造器 对于可变的序列,还可以通过切片操作符 : 来完成浅拷贝 Python 还提供了对应的函数 copy.copy() 函数,适用于任何数据类型 1.1 使用数据类型本身的构造器 lis

qq_40630902的博客 5万+

Python中的深拷贝和浅拷贝的区别

深拷贝和浅拷贝是Python中非常重要的概念,它们在处理对象和数据结构时有着截然不同的行为。理解深拷贝和浅拷贝的区别以及适用场景对于面试和实际编程工作都非常有帮助。在选择深拷贝和浅拷贝时,需要根据具体的需求和数据结构来决定。

这家伙很懒,什么都没有留下 2349

[Python]浅拷贝&深拷贝

深拷贝、浅拷贝

Letmooning的博客 990

Python爬虫实战:5分钟搞定慢慢买历史价格查询(附完整代码)

本文提供了一份Python爬虫实战指南,教你如何快速编写脚本自动查询慢慢买网站的商品历史价格。文章详细拆解了环境准备、接口分析、核心代码实现及常见问题应对,并附有完整代码,帮助读者将爬虫技术应用于日常比价,实现高效购物决策。

weixin_29053577的博客 1015

【2021最新版】Dubbo面试题总结(40道题含答案解析)

文章目录1、为什么要用Dubbo?2、Dubbo的整体架构设计有哪些分层?3、默认使用的是什么通信框架,还有别的选择吗?4、服务调用是阻塞的吗?5、一般使用什么注册中心?还有别的选择吗?6、默认使用什么序列化框架,你知道的还有哪些?7、服务提供者能实现失效踢出是什么原理?8、服务上线怎么不影响旧版本?9、如何解决服务调用链过长的问题?10、说说核心的配置有哪些?11、Dubbo推荐用什么协议?12、同一个服务多个注册的情况下可以直连某一个服务吗?13、画一画服务注册与发现的流程图?14、Dubbo集群容错有

程序媛小琬的博客 1万+

一篇就懂:python浅拷贝copy与深拷贝deepcopy

(4)举例:例如以上的列表list1中,有[1, 2]、(30, 40)、'kkk'三个元素,首先列表本身list1是可变的类型,元素[1, 2]是可变的,元素(30, 40)和'kkk'是不可变的。(1)对象:对象有存储地址id【就好像某个地址的快递仓库】,对象中的元素都有一个地址id【就像仓库的某某货架】(2)对象与对象的元素:(对象)或(对象中的元素)有不同的类型【数字,字符串,列表,字典,集合,元组】定义:可变就是增删改查之后,对象或元素的存储id不会发生改变,反之就不可变。

m0_68136748的博客 1万+

【Nature Communications】超高介电常数材料 Hf0.5Zr0.5O2(HZO)

复旦大学AnQuanJiang团队在《NatureCommunications》发表研究,通过原子层沉积技术制备Hf0.5Zr0.5O2(HZO)薄膜电容器,结合等离子体处理获得突破性性能:介电常数达921,储能密度584J/cm³,效率近100%。研究揭示了铁电性消失后氧空位有序排列产生超高介电常数的机制,并通过同步辐射衍射和STEM分析证实了微观结构转变。该材料在85-300K温度范围内保持稳定,经1万亿次循环后仍能维持100μC/cm²电荷密度,为高密度DRAM和CMOS器件集成提供了新方案。

荷塘阅色 2467

【转】Python - 浅拷贝的四种实现方式

方式一:使用切片 [:] 列表 # 浅拷贝 [:] old_list = [1, 2, [3, 4]] new_list = old_list[:] old_list.append(5) old_list[2][0] += 97 print("Old list:", old_list, "old list id:", id(old_list), " old list[2] id:", id(old_list[2])) print("new list:", new_list, "new list id:"

tecoes的博客 377

【MM小贴士】关于SAP系统中关税的处理方式

的运费,这部分来讲,我们关税的计价基础,就应该是货物价值+包邮到中国港口的运费,完后进行报关操作,缴纳关税,后半段从中国港口拉回到企业里面的运输费,就会做到费用里面去,而不是计入到存货成本。1、我们自己的企业和国外厂家A购买一项物资,厂家A的报价会分成几个组成部分货物本身的价值或者货物本身的价值+到国外港口的运费或者货物本身的价值+到中国港口的运费或者货物本身的价值+包邮到你们自己企业的整体运费。所以我的关税就是不确定的。重点是运费是哪一段的运费,如何结算,结算的货币,何时能够确定运费。.........

竹大的博客 9029

手把手教你学Simulink--基于新型通信技术集成的场景实例:无人机利用激光通信实现高速率数据传输

摘要: 本文基于Simulink搭建无人机激光通信仿真系统,解决传统射频通信带宽不足问题。系统通过五层架构(发射机、信道、PAT系统、接收机、性能分析)实现Gbps级高速传输,重点建模大气衰减(雾/雨)、光束发散、PAT精跟踪(Stateflow+PID控制)等核心模块。仿真结果显示:晴天链路可达2.5Gbps(BER 1e-8),浓雾下链路中断,验证了雾是主要性能限制因素。案例涵盖调制方式选择、动态环境仿真及3D可视化,为无人机高速数据传输提供可扩展的仿真框架,并指出混合FSO/RF、AI-PAT等优化方

MHD0815的博客 181

Python - 浅拷贝的四种实现方式

浅拷贝详解 https://www.cnblogs.com/poloyy/p/15084277.html 方式一:使用切片 [:] 列表 # 浅拷贝 [:] old_list = [1, 2, [3, 4]] new_list = old_list[:] old_list.append(5) old_list[2][0] += 97 print("Old list:", old_list,...

qq_33801641的博客 252

论文复现5:UMI Universal Manipulation Interface

UMI 采用手持式夹具,加上精心的界面设计,可实现便携式、低成本和信息丰富的数据收集,以进行具有挑战性的双手和动态操作演示。配备这些功能后,UMI 框架解锁了新的机器人操作功能,只需更改每个任务的训练数据,即可实现零样本可推广的动态、双手、精确和长视野行为。我们通过全面的现实世界实验展示了 UMI 的多功能性和有效性,其中通过 UMI Zeroshot 学习的策略在对不同的人类演示进行训练时可以推广到新的环境和对象。项目主页:https://umi-gripper.github.io/

github_38060285的博客 1979

【python3基础学习】【第2周】浅拷贝vs深拷贝

概念 浅拷贝:浅拷贝相当于拷贝了原始变量的引用 深拷贝:递归拷贝列表值,整个数据结构的数据,全部拷贝一份 浅拷贝示例 #!/usr/bin/env python # -*- coding: utf-8 -*- import copy if __name__ == '__main__': letters = ["a", "b", ["c", "d"]] letters_copy = letters.copy() print("字母列表:%s" % letters) pri

weixin_38743272的博客 191

SAP SD模块定价过程后台配置简介

只有手工输入定价时(例如,在定价中的定价浏览屏幕中),或者只有从外部处理转移这些定价时(例如,成本核算),才将这些定价包括在确定(价格确定、输出确定,批次确定)之中。定价过程的定义和分配是SD模块中最核心的配置,包含了条件表、条件类型、存取顺序、发票类型、客户定价过程等,确定了销售订单已什么价格销售、税率、附加折扣等多个条件行程有一个定价过程。12、小计:记录该条件类型在VBAP表中是否存储,以及其后续用途,如记入信贷,占用信贷额度,记入成本等,如果需要金额暂用信贷额度的话,在小计这里选择A即可。

我小时候很黑的博客 3784

【毕设实战】飞行器目标识别系统:基于YOLOv5的智能检测全流程教程,助你毕设脱颖而出

亲爱的同学,毕设是不是让你既期待创新又担心技术门槛?如果你的毕设方向是计算机视觉、智能检测,那这个绝对能成为你的“毕设王牌”。从数据准备到界面开发,我会把整个项目拆成“傻瓜式”步骤,让你能一步步做出属于自己的毕设成果。

know_F0727的博客 106

进来了解一下python的深浅拷贝

输出修改person2的name和friends不会影响person1,因为深拷贝递归复制了所有属性。

2401_88862650的博客 5312

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Python 中浅拷贝的四种实现方法

方式一:使用切片 [:] 列表 # 浅拷贝 [:] old_list = [1, 2, [3, 4]] new_list = old_list[:] old_list.append(5) old_list[2][0] += 97 print("Old list:", old_list, "old list id:", id(old_list), " old list[0] id:", id(old_list[2])) print("new list:", new_list, "new list id:"

Python热爱者的博客 3671

假人有限元模型

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

对象复制: Python中关于有四种类型的使用方式,分别为:赋值、创建新对象、浅拷贝与深拷贝。

对象复制: Python中关于有三种类型的使用方式,分别为:赋值、浅拷贝与深拷贝。 一、赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不同。如下: a = [1,2,3,“hello”,[“python”,“C++”]] b = a print a==b #True 这种情况下,b和a是一样的,他们指向同一片内存,b不过是a的别名,是引用。我们可以使用a与b是否相同来判断,返回True,表明他们地址相同,内容相同。 赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,

qq_40290810的博客 807

python学习之【浅拷贝】

python学习记录——浅拷贝

沃和莱特的博客 1354

Python的浅拷贝和深拷贝

浅拷贝是指创建一个新的对象,这个新对象有着原始对象属性值的一份精确拷贝。如果属性是基本数据类型(如整数、浮点数、字符串等),拷贝的就是值本身;但如果属性是容器类型(如列表、字典、集合等),拷贝的就是内存地址,即新对象中的容器类型属性仍然指向原始对象中的容器。深拷贝是指创建一个新的对象,并且递归地拷贝原始对象中的所有属性。如果属性是容器类型,那么容器中的元素也会被拷贝,即新对象中的容器类型属性将指向一个新的容器,这个新容器包含了原始容器中所有元素的拷贝。

Good_tea_h的博客 1091

Python深浅拷贝

在 Python 中,可变类型和不可变类型的拷贝行为有所不同。理解它们的区别对于正确使用浅拷贝和深拷贝非常重要。类型浅拷贝行为深拷贝行为不可变类型与赋值相同,直接引用原对象(如果包含可变对象,则嵌套的可变对象共享)与赋值相同,直接引用原对象(如果包含可变对象,则嵌套的可变对象共享)可变类型创建新对象,但嵌套的可变对象共享创建新对象,并递归复制所有嵌套的可变对象。

大龄程序员 2039

python进阶:浅拷贝与深拷贝详解

而’is’操作符比较的是对象的身份标识是否相等,即它们是否是同一个对象,是否指向同一个内存地址,在python中,每个对象的身份标识,都能通过id(object)获得,因此’is’操作符,相当于比较对象之间的id是否相等。相当于l2会重新开辟一块内存区域,会存储1,2,3,但是不会存储[4,5],只是存储[4,5]对象的引用,如下图所示。我们知道,对于不可变数据类型,没有提供修改它的方法,是不是可以理解为无论是浅拷贝还是深拷贝返回的结果都是一样的。= id(b),即a is b返回的是False。

nzbing的博客 1272

python---三种赋值方式:等号、浅拷贝、深拷贝

说到三种赋值方式,我们先聊聊有哪些变量是可变的。

weixin_41172713的博客 3462
上一篇: Python中dict字典的多种遍历方式
下一篇: Python中repr()、str() 的区别
Python热爱者
博客等级 码龄7年 3059粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值