Python从入门到精通15天(浅拷贝和深拷贝)

2023-05-16

浅拷贝和深拷贝

  • 深浅拷贝概述
  • 浅拷贝
  • 深拷贝

深浅拷贝概述

在Python中,对象是通过引用传递的,这意味如果创建了一个对象,然后将其赋值给另一个变量,那么两个变量将引用同一个对象,即a = [3, 4] b = list(a) b也为[3, 4],这就是所谓的浅拷贝;但有时候我们需要复制一个对象,以便我们能够独立地修改其中一个副本,而不影响原始对象。这时我们的Python就提供了两种方式:浅拷贝和深拷贝。

浅拷贝和深拷贝是指对可变对象对进行复制时所采用的两种不同的方式。深浅拷贝的意义在于编程过程中,根据选择合适的拷贝方式,在避免原始对象被修改的同时,还能避免额外的内存开销。如果需要修改拷贝后的对象而不影响原始对象,则应使用深拷贝。而浅拷贝主要是对第一层数据的值进行拷贝,对第二层数据进行引用,在进行简单的操作时可以使用。

他主要应用于多线程中,如果多线程需要同时操作同一个数据结构,那么为了避免并发访问的冲突,通常会使用深拷贝创建多个完全独立的数据结构,从而使每个线程都可以独立地操作自己地数据结构而不会影响其他线程。如果只需要复制对象地部分属性或方法,那么使用浅拷贝即可。

浅拷贝

在Python中,浅拷贝只是创建一个新的对象,然后将原始对象中的第一层所有元素的复制到新对象中,第二层则是将引用复制到新对象。如果原始对象第二层包含可变对象(列表、字典等),那么拷贝后的对象的第二层也将包含相同的可变对象的引用,因此,如果对原始对象第二层的值进行改变,那么拷贝的对象也会受到同样的改变。如果原始为不可变对象,则原始值不会受到改变。

例举一个列表,并改变值,具体代码如下:

import copy

list1 = [1, 2, 3, 4, 5]

# 使用标准函数库
list2 = copy.copy(list1)

print("拷贝前的list2值", list2)

# 对原始列表的值进行改变
list1[3] = 6

print("改变后的list1值", list1)
print("改变后的list2值", list2)

结果如下:

在这里插入图片描述

例举一个嵌套列表,并改变第二层的值,具体代码展示如下:

import copy

list1 = [1, 2, 3, [4, 5], [6, 7]]

# 内置函数copy
list2 = list1.copy()

# 使用标准函数库
list3 = copy.copy(list1)

print("拷贝前的list2值", list2)
print("拷贝前的list3值", list3)

# 对原始列表的第二层值进行改变
list1[3][1] = 6

print("改变后的list1值", list1)
print("改变后的list2值", list2)    
print("改变后的list3值", list3)

结果如下:

在这里插入图片描述

由此可以得出结论,浅拷贝只拷贝第一层,第二层拷贝的是原始对象的引用,如果原始对象的第二层进行了改变,则相应的拷贝对象的值也会改变。

深拷贝

深拷贝则会递归复制所有地可变对象和不可变对象,从而创建一个完全独立的新对象,并不会拷贝原始对象的引用。这意味着如果拷贝后的对象修改了其中的一个可变对象的值,那么原始对象不会受影响。

改变列表第一层的值,具体代码展示如下:

import copy

list1 = [1, 2, 3, [4, 5], [6, 7]]


list2 = copy.deepcopy(list1)

print("改变前的list2值", list2)

# 对原始对象的第一层进行值的改变
list1[2] = 9

print("改变后的list1值", list1)
print("改变后的list2值", list2)


结果如下:

在这里插入图片描述

改变列表第二层的值,具体代码展示如下:

import copy

list1 = [1, 2, 3, [4, 5], [6, 7]]


list2 = copy.deepcopy(list1)

print("改变前的list2值", list2)

# 对原始对象的第二层进行值的改变
list1[3][1] = 6

print("改变后的list1值", list1)
print("改变后的list2值", list2)

结果如下:

在这里插入图片描述

由此可以得出结论,深拷贝只是复制了值,并没有进行引用,即创建一个完全独立的对象,即使对原始对象的值进行了修改,也不会改变拷贝对象的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python从入门到精通15天(浅拷贝和深拷贝) 的相关文章

随机推荐

  • 【Linux网络编程】TCP并发服务器的实现(IO多路复用select)

    文章目录 一 服务器模型1 1 服务器概念1 2 TCP并发服务器的意义1 3 实现TCP并发服务器的方式 二 使用IO多路复用实现TCP并发服务器优势三 select函数四 TCP并发服务器的构建4 1 创建套接字4 2 填写服务器网络信
  • 树莓派解决cannot currently show the desktop最优法

    最近在搞树莓派前面的步骤都轻轻松松的解决了这个问题卡了我很久 这个是解决之后的效果 xff0c 我使用改分辨率用了很多办法这个办法解决的效率最快 直接在下载好文件的解决 1 将有sd卡的读卡器插入 2 在config txt文件中加入四句话
  • 十、C++中的类 class与struct的区别

    面向对象程序设计 xff0c 需要诸如类和对象这样的概念 C 43 43 支持面向过程 基于对象 面向对象 泛型编程四种 C语言不支持面向对象编程 类是一种将数据和函数组织在一起的方式 一个函数参数过多 xff0c 代码不好维护 xff0c
  • 飞控开发--气压计MS5611

    ms5611简介 xff1a 官方给出的最大分辨率 xff1a 10cm 工作电压 xff1a 1 8v 3 6v 气压 AD 精度 xff1a 24位 工作环境 xff1a xff0d 40 43 85 C xff0c 10 1200mb
  • 如何使用JavaScript将Set转换为Array?

    如何使用JavaScript将Set转换为Array xff1f 下面本篇文章家里给大家介绍一下在JavaScript中将Set转换为Array的方法 xff0c 希望对大家有所帮助 在JavaScript中 xff0c 想要将Set xf
  • 如何在Markdown中插入图片并顺利共享

    使用PicGo 43 GitHub搭建图床 实现便捷的Markdown图片管理 昨天在呕心沥血写 xff08 搬 xff09 完我的第一篇技术分享博文m1 使用 VMware 安装 CentOS7 并部署 k8s 高可用集群之后 xff0c
  • 海康威视网络摄像头sdk的开发(Demo的使用)指南

    如果您是想实现海康sdk包的Demo实例中MFC的分功能 xff0c 那么请慢慢看 xff0c 这篇文章百分之九十九可以帮你实现 提醒 xff1a 内容来自网络和自己实际操作 xff0c 如有问题请联系hww168 64 yeah net
  • Proxy反向代理解决跨域问题

    一 问题的产生 在项目开发过程中遇到了一个问题 xff0c 访问图片与访问其他的数据的服务器不是同一个 xff0c 虽然后台已经将两个服务器合并到一个 xff0c 但是前台配置好后访问就会产生了一个问题 xff0c 具体报错如下 xff1a
  • 什么是枚举【详解】

    本期介绍 x1f356 主要介绍 xff1a 什么是枚举 xff0c 枚举是如何定义 初始化的 xff0c 以及枚举到底如何使用 xff0c 还有枚举这种语法存在的优点有那些 x1f440 文章目录 一 什么是枚举 x1f356 二 枚举类
  • vscode将项目导入远程仓库 git

    1 打开软件 点击第三个图标 远程仓库 点击代码管理右上角三个小点 远程 远程仓库 添加远程存储库 跳出输入框 2 复制git的地址 3 将上一步复制的仓库链接 粘贴进去 回车 4 命名 5 打开命令行 输入下列命令 用户名 邮箱 PS D
  • 深度学习二

    BT神经元为按照误 差逆向传播算法训练的多层前馈神经网络 BT神经网络分为输入层 隐藏层 输出层 输入层一般有数据种类多个神经元 xff0c 接受数据 隐藏层的神经元为根号下隐藏层 输出层加b个 xff0c 输入的每个数据加权和返回数之和为
  • ROS学习(五)

    学习古月 ROS机器人开发实践 一书时 xff0c 在第六章的6 3遇到的问题的总结 在执行将xacro文件转化成urdf的文件格式时 xff0c 执行语句 rosrun xacro xacro py mrobot urdf xacro g
  • 新建Mavlink消息

    1 下载Mavlink生成器 1 1 Git clone 需要在翻墙的网络环境下下载 span class token function git span clone https github com mavlink mavlink git
  • Python从入门到精通11天(lambda匿名函数和map函数的使用)

    lambda匿名函数和map函数的使用 lambda匿名函数map函数lambda与map的联用 lambda匿名函数 匿名函数在计算机编程中是指一类无需定义标识符 xff08 函数名 xff09 的函数或子程序 xff0c lambda函
  • STM32F407单片机移植ADS1115驱动程序

    最近一个工程项目需要使用ADS1115采集电压 xff0c 网上研究了一下 xff0c 测试成功 xff0c 期间走了很多弯路 xff0c 为避免后来的研究者重走我的老路 xff0c 特分享给大家 注 xff1a 网上很多ADS1115驱动
  • Python入门到精通12天(迭代器与生成器)

    迭代器与生成器 迭代器生成器 迭代器 迭代器是可迭代的对象 xff0c 即可以进行遍历的对象 列表 字符串 元组 字典和集合这些都是可迭代的对象 xff0c 都可以进行遍历 迭代器是一种访问序列元素的方式 xff0c 它可以通过next 函
  • C语言从入门到精通第8天(分支结构if、else、switch的使用)

    分支结构if else switch的使用 if语句if else语句if else嵌套if else if else语句switch语句 if语句 语法 xff1a if 表达式 语句 xff1b 如果表达式为真 xff0c 则执行 里面
  • Python入门到精通13天(global和nonlocal关键字的使用)

    global和nonlocal关键字的使用 作用域global关键字的使用nonlocal关键字的使用 作用域 在Python中变量的作用域由其代码块决定 xff0c 在代码块中定义的的变量和函数属于局部作用域 xff1b 在函数中定义的变
  • Python从入门到精通14天(eval、literal_eval、exec函数的使用)

    eval literal eval exec函数的使用 eval函数literal eval函数exec函数三者的区别 eval函数 eval 是Python中的内置函数 xff0c 它可以将一个字符串作为参数 xff0c 并将该字符串作为
  • Python从入门到精通15天(浅拷贝和深拷贝)

    浅拷贝和深拷贝 深浅拷贝概述浅拷贝深拷贝 深浅拷贝概述 在Python中 xff0c 对象是通过引用传递的 xff0c 这意味如果创建了一个对象 xff0c 然后将其赋值给另一个变量 xff0c 那么两个变量将引用同一个对象 xff0c 即