[Python]浅拷贝&深拷贝

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

0 前置知识

  • 可变类型:可以修改的对象,包括列表、字典、集合。
  • 不可变类型:一旦创建就不可修改的对象,包括字符串、元组、数值类型(整型、浮点型)
  • 什么是深浅拷贝:一种数据复制方式
  • 深浅拷贝得到的结果都是复制后的内容,针对嵌套情况有所不同

1 浅拷贝

  • 创建一个新对象,只拷贝外层对象,内层依然是原数据的引用。
  • 可变类型:如果改变了内层数据,则两个对象都会受到影响。
  • 不可变类型:不会拷贝外层对象,也不会拷贝内层对象,只是原数据的引用。
  • 特殊情况:内外层都引用,不拷贝。
# 浅拷贝——可变类型
import copy
list1=[1,2,3,[4,5]]
# 切片是浅拷贝的一种
list2=copy.copy(list1)
print(id(list1),'外层地址不同')
print(id(list2),'外层地址不同')
print(id(list1[3]),'内层地址相同')
print(id(list2[3]),'内层地址相同')

# 浅拷贝带来的影响,如果内存对象发生改变,则两个对象都会受到影响
list2[3][0]=6
print(list1)

# 浅拷贝——可变类型
import copy
list1=[1,2,3,[4,5]]
list2=copy.copy(list1)

print(id(list1),'外层地址不同')
print(id(list2),'外层地址不同')

list1.append(6)
print('list1',list1)
print('list2',list2)

# 浅拷贝-不可变类型
import copy
str1='abc'
str2=copy.copy(str1)
# 地址相同
print(id(str1))
print(id(str2))

str1+='d'
print(str1)
print(str2)
# 地址不同
print(id(str1))
print(id(str2))
# 浅拷贝-不可变类型
import copy
str1='abc'
str2=copy.copy(str1)
# 地址相同
print(id(str1))
print(id(str2))

str1+='d'
print(str1)
print(str2)
# 地址不同
print(id(str1))
print(id(str2))

# 浅拷贝-不可变类型
tuple1=(1,2,3,(4,5))
tuple2=copy.copy(tuple1)
print(id(tuple1))
print(id(tuple2))

print(id(tuple1[3]))
print(id(tuple2[3]))

# 浅拷贝-特殊情况;内外层都引用
tuple1=(1,2,3,[4,5])
tuple2=copy.copy(tuple1)
print(id(tuple1))
print(id(tuple2))
print(id(tuple1[3]))
print(id(tuple2[3]))

2 深拷贝

  • 创建一个对象,不仅可以拷贝外层,内层对象也会被拷贝,形成两个完全独立的对象。
  • 可变类型:外层对象和内层对象都会被拷贝,其中一个数据的改变,不会影响另一个变量。
  • 不可变类型:不会拷贝外层对象,也不会拷贝内层对象,只是原数据的引用。
  • 特殊情况:外层可变内层不可变,外层对象和内层对象都会被拷贝(同可变类型)。
import copy
list1=[1,2,3,[4,5]]
list2=copy.deepcopy(list1)
# 外层对象完成拷贝
print(id(list1))
print(id(list2))
# 内层对象也被拷贝
print(id(list1[3]))
print(id(list2[3]))
list2[3][0]=6
print(list1)
print(list2)

# 深拷贝-可变类型
import copy
list1=[1,2,3,[4,5]]
list2=copy.deepcopy(list1)

print(id(list1))
print(id(list2))

list1.append(6)
print(list1)
print(list2)

print(id(list1))
print(id(list2))

# 深拷贝-不可变类型
tuple1=(1,2,3,(4,5))
tuple2=copy.deepcopy(tuple1)
print(id(tuple1))
print(id(tuple2))

print(id(tuple1[3]))
print(id(tuple2[3]))

# 深拷贝-特殊情况
tuple1=(1,2,3,[4,5])
tuple2=copy.deepcopy(tuple1)
print(id(tuple1))
print(id(tuple2))
print(id(tuple1[3]))
print(id(tuple2[3]))

3 赋值

# 赋值-可变类型
list1=[1,2,3,[4,5]]
list2=list1
print(id(list1))
print(id(list2))
list1.append(6)
print(list1)
print(list2)
print(id(list1))
print(id(list2))

# 赋值-特殊情况
list1=(1,2,3,[4,5])
list2=list1
print(id(list1))
print(id(list2))
list1[3].append(6)
print(list1)
print(list2)
print(id(list1))
print(id(list2))


dict1={'A':3,'B':4}
dict2=dict1
dict1['A']=9
result=dict1['A']+dict2['A']
print(result)
print(id(dict1))
print(id(dict2))

85、Python之鸭子类型:魔术方法&深拷贝和浅拷贝 本文介绍了三种对象“拷贝”的方式,也就是赋值、浅拷贝、深拷贝。对比了浅拷贝和深拷贝的运行机制。最后,简单演示了通过魔术方法__copy__()和__deepcopy__()进行自定义浅拷贝和深拷贝行为。 阅读详情

相关推荐

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

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

旦莫的博客 3969

Python 深拷贝和浅拷贝详解

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

qq_40630902的博客 5万+

Python中的深拷贝详解

与深拷贝相对的是浅拷贝,浅拷贝只复制对象的引用,而不是对象本身。总结起来,深拷贝是一种非常有用的技术,用于创建对象的独立副本,特别是在复制嵌套的数据结构时。例如,当我们需要创建一个与原始字典完全相同的副本,以便在修改副本时不会影响到原始字典时,就可以使用深拷贝。从输出结果可以看出,浅拷贝只复制了原始列表的引用,所以修改浅拷贝后的列表也会影响到原始列表。深拷贝是Python中一个重要的概念,它用于创建一个对象的完全独立副本,包括所有嵌套对象和其内容。在本文中,我们将详细介绍深拷贝的概念、用法和实际示例。

CyberNerdX的博客 784

【Python】python深拷贝与浅拷贝详解(必须掌握)

(关注“测试开发自动化” 弓中皓,获取更多学习内容)

测试开发自动化 1万+

RocketMQ源码分析之消息轨迹

文章目录前言一、消息轨迹二、消息轨迹源码分析1、producer端2、consumer端三、消息轨迹中存储的信息1.TraceContext2.TraceBean3.TraceType四、总结 前言   本篇文章将会从以下方面介绍消息轨迹:什么是消息轨迹?如何启用消息轨迹?示例demo、消息轨迹的源码分析和消息轨迹中存储的信息。最后会用一张图来总结消息轨迹的工作原理。 一、消息轨迹 1.什么是消息轨迹? 消息轨迹是用来跟踪记录消息发送、消息消费的轨迹。 2.如何启用消息轨迹? broker端 需要在b

不爱学习的小妞博客 1076

430单片机实现三人投票表决器_基于单片机的五人表决器的设计

姚海云+马野摘要:本设计利用51单片机,按键开关模块,数码管显示模块和LED模块来实现一个简单的五人表决器的功能。按键开关模块中的键2~键6表示五个人,由5个人来投票,当同意的票数大于或者等于3人时,数码管显示同意的人数,说明表决通过。当表决的人数小于3时,数码管显示同意的人数。关键词:表决器;单片机;流水灯;数码管;矩阵键盘;时钟中图分类号:TP391 文献标识码:A 文章编号:1009-304...

weixin_33277215的博客 2559

python中的浅拷贝&深拷贝

浅拷贝,深拷贝 提到拷贝,主要使用赋值、copy模块、列表切片、字典copy()来实现拷贝。 # 赋值 list1 = [1,2,3,4,5] list2 = list1 list2[0] = 100 print(list1,id(list1)) print(list2,id(list2)) # [100, 2, 3, 4, 5] 2166018012616 # [100, 2, 3, 4, 5...

随心写写 309

vSphere环境证书更新/续订案例及注意事项

早期VMware的用户随后“十年之期”已到,陆陆续续出现各种登录问题,证书报错告警等,主要包含6.5到7.0的版本,VMware服务器虚拟化环境涉及的证书及类型较多,在实际更新中会出现各种奇怪的问题,有些坑耗费了大量的troubleshooting时间,极端情况下一天能看到十多遍如下报错😂本文整理了一个近期的更新案例,以及之前处理过的一些问题,仅作参考CA根证书颁发机构,用于签发其他组件的证书,其他证书的有效期不会超过根证书。

RaySun的技术Blog 3207

【Python】深拷贝 & 浅拷贝

深拷贝 & 浅拷贝 赋值:value、id 都一样。可以理解为,给原变量起了个别名。 dic1 = {'name': '超人', 'age': 20, 'sex': '男'} dic2 = dic1 print(id(dic1), id(dic2)) # ----------输出---------- # 2405975743944 2405975743944 拷贝:对于表层数据,value 一样,id 不一样 ​ 直接进行浅拷贝 dic1 = {'name': '超人', 'age':

Superman_H的博客 193

基于STM32 HAL库的L298N四驱电机PWM调速与方向控制实战

本文详细介绍了基于STM32 HAL库驱动L298N电机控制板实现四驱小车PWM调速与方向控制的实战方法。涵盖硬件连接、GPIO与定时器配置、PWM生成、方向控制逻辑及电源管理等核心内容,并提供代码优化与常见问题解决方案,帮助开发者快速实现高效稳定的电机控制。

jump7的博客 222

宝塔面板添加站点及运营商SSL免费证书的申请与使用

本文详细介绍在宝塔面板下如何正确添加站点、配置站点,及在运营商如何申请免费SSL证书,将其配置到宝塔站点里。 给你的网站加一把锁,教你免费SSL证书申请,配置到自己的网站中。 环境:Ubuntu server 18 工具:宝塔控制面板 平台:阿里云 Web服务器:Nginx 宝塔:https://www.bt.cn/ 阿里云:https://www.aliyun.com/ 腾讯云:https://cloud.tencent.com/ 要求: 1.宝塔控制面板搭建完毕。 2掌握域名解析的原理。 3.了解ht

贺兰山长老 5060

Python 浅拷贝 & 深拷贝

修改时会直接开辟新内存空间、生成新对象,不会影响原引用,因此浅拷贝后的第一层数据相互独立。,浅拷贝未复制深层子对象,二者共用同一个内存地址,原地修改数据会影响所有引用该对象的变量。可以看到拷贝后的新列表地址改变了,但列表各个元素还是同一地址。(1)创建一个列表,其中包含整型和列表元素,使用。修改list[0]整型元素和list[3]列表元素。(1)创建一个列表,其中包含整型和列表元素,使用。原列表数据完全修改,深拷贝后的list3。查看列表地址和列表中各个元素的地址。原列表和拷贝列表的嵌套列表。

2301_81244597的博客 429

Django 前后端分离实战:网络设备运维系统 - 从登录认证到业务模块

这篇文章分享了Django+Vue前后端分离开发网络设备运维系统的实战经验,重点介绍了登录认证、全局布局和设备管理三大模块的实现。文章包含以下核心内容: 登录模块实现:包括表单验证、Token认证、记住密码功能,以及美观的UI设计(渐变背景、毛玻璃效果) 全局布局架构:采用侧边栏+顶部导航的响应式设计,支持菜单权限控制和多设备适配 业务功能开发:详细展示了设备分类和部门管理的CRUD功能实现,包括列表展示、搜索过滤、分页等功能 常见问题解决:提供了5个开发中常见问题的解决方案,如Vue Router警告、C

qq_16766705的博客 526

python_深拷贝&浅拷贝

Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的 copy模块。 copy.copy 浅拷贝——只拷贝父对象,不会拷贝对象的内部的子对象。(所有子对象是引用拷贝) copy.deepcopy 深拷贝——拷贝对象及其子对象。(不可变类型的子对象是引用拷贝,可变类型的子对象是值拷贝。) 浅拷贝:引用拷贝 >>> a=[1,2,3,['a','b'...

Folivoraxue的博客 216

超临界二氧化碳再热再压缩布雷顿循环建模与先进控制

超临界二氧化碳布雷顿循环建模与先进控制研究 本文研究了超临界二氧化碳再热再压缩布雷顿循环系统的建模与控制。通过MATLAB/Simscape构建了包含压缩机、透平、回热器等关键组件的动态模型,并设计了基于模型预测控制(MPC)和自抗扰控制(ADRC)的多层控制策略。系统采用转速控制的压缩机、阀门开度控制的透平,以及可变热源加热器,实现了全动态分析。研究结果表明,MPC与ADRC混合控制方案相较于传统PID控制,功率超调降低至0.9%,效率波动控制在±0.08%,扰动恢复时间缩短至12秒。

AI的内部世界的博客 343

ZW3D 二次开发-制作插件

1.Windows 7 SP1 或 Windows 10 或 Windows 11(推荐 Windows 11)2.Visual studio 2017-2022 (或 C/C++的任何其他集成开发环境)(推荐 Visual studio 2022)3.ZW3D 2023 或以上版本(建议使用与 ZW3D 一致的 API 的版本)4.Qt5.9.7(for Windows)博主学习使用环境的是:Windows 11 Version 24H2 + Visual studio 2022 + Qt5.9.7(fo

fhqiwmc的博客 814

Python —— 深拷贝&浅拷贝

深拷贝(Deep Copy):深拷贝创建了一个新的对象,该对象与原始对象的内容相同,包括所有的嵌套对象。深拷贝产生了一个完全独立的复制,修改原始对象中的可变对象不会影响新对象。示例代码:print(original_list) # 输出:[5, 2, [6, 4]]print(deep_copy_list) # 输出:[1, 2, [3, 4]]浅拷贝创建了一个新的对象,该对象与原始对象的内容相同,但是对于可变对象(如列表和字典)来说,新对象只是原始对象的一个引用。

南夏一木子的博客 450

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

python浅拷贝的应用_Python3 & 浅拷贝与深拷贝

在Python中对象的赋值(=)其实就是对象的引用。即:当创建一个对象,把它赋值给另一个变量时,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。Python中对象的拷贝分为:浅拷贝(copy)和深拷贝(deepcopy)。浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,将原对象在内存中引用地址拷贝过来,然后让新的对象指向这个地址。可以使用“=”或列表自带的...

weixin_30725113的博客 172

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python练习四-浅拷贝&深拷贝

一、数字、字符串不论是浅拷贝、深拷贝都是指向一个地址。 a = 1 b = "abc" print (id(a)) print (id(b)) a1 = a b1 = b print (id(a1),id(b1)) a2 = copy.copy(a) b2 = copy.copy(b) print (id(a2),id(b2)) a3 = copy.deep...

aihan6619的博客 213

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python-深拷贝&浅拷贝

浅拷贝:只拷贝了对象,对象内的元素并不会发生拷贝。深拷贝:不仅拷贝对象,对象内的元素也会发生拷贝。

qq_45939519的博客 208

Python 列表,元组,字典,深拷贝&浅拷贝

列表(list)--> [ ] 可变, 下标检索, 添加(insert(想插入的位置)/append(默认在最后添加)) 删除(del:删除整个列表/remove:删除元素/pop:删除最后一个元素,可返回元素值) 元组(tuple)-->() 不可变,可转成list进行改变然后在转回tuple 下标检索 删除(del:删除整个元组) 字典(dictionary)--&g...

Diana827的博客 410

python 深拷贝&浅拷贝

python 深拷贝与浅拷贝

小仙女的博客 324

深入理解python中的赋值&浅拷贝&深拷贝

       我们知道,python提供了copy库供我们解决赋值所造成的变量之间会相互影响的问题。但是,造成这种变量之间相互影响的根本原因是什么呢?copy库解决这些问题的机制又是什么呢?copy库中浅拷贝和深拷贝的应用场景又分别是哪些呢?下面从基础原理说起,并逐渐向上进行解释。 目录 可变对象和不可变对象 python函数参数是传值还是传引用? copy.copy和copy.deepc...

newchitu的博客 342

Python(7)——Python入门之列表&元组&深拷贝浅拷贝区别

文章目录前言1、列表(python中用的最多的一个数据类型)1.1 列表的创建1.2 列表的基本特性1.3 对列表操作常用方法(增删改查)1.3.1 增加1.3.2 修改: 通过索引和切片重新赋值的方式。1.3.3 查看: 通过索引和切片查看元素。 查看索引值和出现次数。1.3.4 删除2、元组2.1 元组的创建2.2 元组的基本特性2.3 元组的使用方法--查看(不可以增删改)3、命名元组的操作(扩展)4、is 和 == 的区别5、深拷贝与浅拷贝区别5.1 概述5.2 举例说明5.3 小结6、练习题 .

Ghost_0110 1133

浅析python 数据存储原理&深拷贝&浅拷贝&is ==

1.存储方式 在高级语言中,变量是对内存及其地址的抽象。 对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。 引用语义:在python中,变量保存的是对象(值)的引用,我们称为引用语义。采用这种方式,变量所需的存储空间大小一致,因为变量只是保存了一个引用。也被称为对象语义和指针语义。 值语义:有些语...

AI蜗牛之家 1410

简析 深拷贝&浅拷贝 Python

1.深拷贝:递归里面的数据全部复制一份,这个性能低.其中元组,字符串,数字,深拷贝时,跟我们的引用一样2.浅拷贝:复制第一层的数据 

weixin_42008209的博客 186
上一篇: [Python]算法 & 数据结构
下一篇: [Linux]操作系统
Letmooning
博客等级 码龄2年 503粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值