首页 > 编程语言 >一篇文章带你全面搞懂面试必问系列之 Python 深浅拷贝

一篇文章带你全面搞懂面试必问系列之 Python 深浅拷贝

时间:2024-11-30 21:28:47浏览次数:13  
标签:外层 必问 Python 数据类型 对象 可变 搞懂 拷贝

当你在面试中被问到“Python 的深拷贝和浅拷贝有什么区别?”时,是否瞬间大脑一片空白?这个问题不仅频繁出现在技术面试中,也是衡量你对 Python 内存管理和数据操作理解的重要考察点。

那么,什么是深拷贝和浅拷贝?它们究竟有何不同?又该在何种场景中使用?

在当下的开发场景中,无论是数据分析还是 Web 开发,大量数据处理已经成为常态。误用浅拷贝会导致数据被无意修改,引发难以察觉的 BUG。

关于深浅拷贝

在 Python 中,用等号 = 给变量赋值时,并不会真正复制对象,而只是让新的变量指向原来的对象。也就是说,新变量和原来的变量其实是共享同一个对象。如果想要创建一个“真正的副本”,让新对象和原对象互相独立,我们可以使用 Python 的 copy 模块来实现。copy 模块中提供了两种方式:深拷贝及浅拷贝:

深拷贝和浅拷贝的概念用于描述对象的复制方式,它们的主要区别在于是否递归复制对象中的嵌套对象

浅拷贝:创建一个新对象,只复制原对象的第一层引用,嵌套对象仍然与原对象共享引用。

深拷贝:创建一个完全独立的新对象,递归复制原对象及其嵌套对象的所有内容。

 

 

Python深拷贝语法:

copy.deepcopy(x)

Python浅拷贝语法:

copy.copy(x)

 

为了更加直观了解深拷贝和浅拷贝的区别,这里我们可以通过代码可视化网站python tutor清楚的看到代码执行的每一步发生了什么、变量的作用域和其对应关系都一目了然:

Python Tutor - Python Online Compiler with Visual AI Help

 

 

测试验证浅拷贝:

单层数据结构:

image.png

  • 对于可变类型如列表、字典、集合,浅拷贝会开辟新的空间地址,进行浅拷贝
  • 对于不可变类型如数字、字符串、元组,浅拷贝仅仅是地址指向,不会开辟新空间拷贝值

 

外层对象是可变的,内层对象是不可变的:

image.png

外层对象是不可变的,内层对象是可变的:

image.png

外层对象是可变的,内层对象是可变的:

image.png

外层对象是不可变的,内层对象是不可变的:

image.png

浅拷贝总结:

浅拷贝是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。使用浅拷贝的时候,分为两种情况:

  • 第一种,如果最外层的数据类型是可变的,如列表、字典、集合,浅拷贝会开启新的地址空间去存放。
  • 第二种,如果最外层的数据类型是不可变的,如数字、字符串、元组,浅拷贝对象的时候,还是引用原对象的地址空间。

 

 

测试验证深拷贝:

单层数据结构:

image.png

这里的表现和浅拷贝是一样的

对于外层对象是可变的,内层对象是不可变的:

image.png

对于外层对象是不可变的,内层对象是可变的:

image.png

外层对象是可变的,内层对象是可变的:

image.png

外层对象是不可变的,内层对象是不可变的:

image.png

深拷贝总结:

深拷贝对一个对象是所有层次的拷贝(递归),内部和外部都会被拷贝过来。深拷贝也分两种情况:

  • 第一种,最外层数据类型可变。外层的会新开辟地址空间存放。如果里面是可变数据类型,内部会新开辟地址空间存放。如果内部数据类型不可变,内部则是对地址的引用。
  • 第二种,外层数据类型不可变,如果内部数据是可变数据类型,外部和内部都会新开辟地址空间存放。如果内部数据类型不可变,外部和内部都是对地址的引用。

理解深浅拷贝不仅仅是为了面试,它更是写出健壮、可维护代码的关键一步。尤其在操作复杂对象时,合理运用深浅拷贝能极大提升程序的可靠性。

掌握深浅拷贝,不只是一次技术提升,更是面试中技压群雄的秘密武器!

 

标签:外层,必问,Python,数据类型,对象,可变,搞懂,拷贝
From: https://blog.csdn.net/m0_58552717/article/details/144161279

相关文章

  • 树莓派上手攻略:轻松切换至默认Python 3环境,解锁更多编程可能
    树莓派上手攻略:轻松切换至默认Python3环境,解锁更多编程可能前言树莓派作为一款开源的微型计算机,因其低成本和高灵活性而受到广泛欢迎。Python作为树莓派的官方编程语言,以其简洁的语法和强大的功能,成为了许多初学者和开发者的首选。然而,默认情况下,树莓派可能预装了Python2,这......
  • python毕设 宠物寄养系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于宠物寄养系统的研究,现有研究主要以宠物领养系统或单纯的寄养业务流程为主,专门针对宠物寄养系统全面功能设计与实现的研究较少。在......
  • Python使用pygame写的贪吃蛇详解
    使用python实现的贪吃蛇小游戏,只实现了基础功能代码importpygame#python中流行游戏开发库,提供图像处理等功能importrandom#python标准库,随机生成数,随机生成食物位置#初始化模块pygame.init()#颜色white=(255,255,255)yellow=(255,255,102)black=......
  • python毕设 在线学习平台程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于在线学习平台的研究,现有研究主要以平台的整体架构和功能实现为主,如大规模在线课程平台(MOOC)的设计与推广等。然而专门针对Python技......
  • Python练习
    练习11、已知lst=[5,2,1,4,9],程序实现:删除lst元素中的最大值和最小值(不考虑多个最值情况)lst=[5,2,1,4,9]lst.sort()print(lst)#[1,2,4,5,9]dellst[0],lst[len(lst)-1]print(lst)#[2,4,5]lst.pop(0)print(lst)#[4,5]练习22、已知info={......
  • 从高校就业信息管理系统到Python和Java类系统开题报告:结构化研究的提纲优化
    个人名片......
  • Python入门 - 判断语句
    判断No.1if判断概念:如果判断条件为真(True),就让程序执行某些代码如果判断条件为假(False),就让程序跳过某些代码语法:ifTrue:print("今天状态很不错")if代表“如果”,是关键字if后面跟随判断条件,结果为真or假英文冒号是if判断的固定格式,表示该句的结束需要在归属于i......
  • Python入门 - 编程基础
    代码与文本No.1输入和输出概念:输入:计算机【收到】来自外界的数据传递·输出:计算机对外界【发出】的数据传递print:理解为“打印”,能让计算机在屏幕上输出内容语法:print("Helloworld")print语法包含四个部分:指令名print;指令附带的括号();标记文本的双引号”;引用的文本......
  • Python深度强化学习智能体DDPG自适应股票交易策略优化道琼斯30股票数据可视化研究
    全文链接:https://tecdat.cn/?p=38380原文出处:拓端数据部落公众号股票交易策略在投资公司中起着至关重要的作用。然而,在复杂多变的股票市场中获取最优策略颇具挑战。本文探索深度强化学习在优化股票交易策略以实现投资回报最大化方面的潜力。选取30只股票作为交易标的,其每日价......
  • Python蒙特卡罗MCMC:优化Metropolis-Hastings采样策略与Fisher矩阵计算参数推断应用—
    全文链接:https://tecdat.cn/?p=38397原文出处:拓端数据部落公众号本文介绍了其在过去几年中的最新开发成果,特别阐述了两种有助于提升Metropolis-Hastings采样性能的新要素:跳跃因子的自适应算法以及逆Fisher矩阵的计算,该逆Fisher矩阵可用作提议密度。通过多个示例展示,这些......