首页 > 编程语言 >Python中的浅复制与深复制

Python中的浅复制与深复制

时间:2023-07-25 21:45:11浏览次数:29  
标签:slice tuple Python list 对象 复制 copy

 

1. 元组:元组是不可变的有序列表。

1 a= [30,40]
2 tuple_a = (1, 2, a)
3 a[0] = 3
4 tuple_a
5 # >>> (1, 2, [3, 40])        # 元组是不可变的,但是元组中的元素如果是引用(某个对象的地址),引用的对象是可能会改变的。

 

2. copy模块中的copy方法可能可以浅复制一个对象。

浅复制的意思是: (1)创建一个新的对象,(2)将原始对象中找到的子对象插入其中。(如果子对象是引用,则复制引用而不是复制引用的对象)

import copy

a= [30,40]
list_a = [1,2,a]
list_b = copy.copy(list_a)
list_a is list_b                 # 返回False。list_a和list_b是两个不同的对象,copy.copy(list_a)执行了浅复制

tuple_a = (1, 2, a)
tuple_b =copy.copy(tuple_a)
tuple_a is tuple_b                # 返回True。根本没有进行浅复制,copy.copy(tuple_a) 直接返回了tuple_a

为什么copy.copy对于不同的对象有不同的行为? copy.copy会使用对象中定义的__copy__或者copy方法,如果对象没有定义相关方法,就直接返回这个对象。

a= [30,40]
tuple_a = (1, 2, a)
list_a = [1,2,a]
# 通过obj.cpoy()调用对象的__copy__,或copy方法
tuple_a.copy()                        # 报错,因为元组没有copy方法。
list_a.copy()               # 正常执行,因为list有cpoy方法
dir(tuple_a)                # 查看对象的方法,可以进一步验证这一点

 

3. 对一个序列进行切片操作,默认执行的是浅复制。根据上一条,浅复制行为又取决于对象中是否定义了、如何定义浅复制。

a= [30,40]

list_a = [1,2,a]
slice_list_a = list_a[:]          # 等同于: slice_list_a = copy.copy(list_a)。 也等同于: slice_list_a = list(list_a)
list_a is slice_list_a          # False
tuple_a = (1, 2, a)
slice_tuple_a = tuple_a[:]        # 等同于: slice_tuple_a = copy.copy(tuple_a)。也等同于: slice_tuple_a = tuple(tuple_a)
tuple_a is slice_tuple_a        # True

 

4. 深复制

深复制的意思是:(1)创建一个新的对象,(2)递归地将在原始对象里找到的子对象的副本插入其中。

简单说就是:副本和父本的内容一样,但是不会相互影响。

5. 结论

  1. 浅复制和深复制的结果只在复合对象(对象包含引用)才有差别。
  2. 明确要求副本和父本不相互影响,最好进行深复制。
  3. 深复制(copy.deepcopy)和浅复制(copy.copy)都会受对象中定义的相关方法所影响。

标签:slice,tuple,Python,list,对象,复制,copy
From: https://www.cnblogs.com/shengou/p/17581126.html

相关文章

  • AI训练营—Python的一些基础知识
    目录列表字典复制对象列表切片:左开右闭倒取值字典集合:无序的,元素是唯一的dk_set=set()#也可以是dk_set={},创建一个空的集合#集合的并union(),交intersection(),差difference()#集合不会出现重复元素foriin"Dkfor3,Dkfor3":dk_set.add(i)#添加元素i的值进集合......
  • python 转义括号
    Python转义括号的实现过程概述在Python编程中,转义括号是一种特殊的语法,用于表示字符串中的括号字符。当我们需要在一个字符串中包含括号时,为了避免与代码中的括号产生歧义,我们需要使用转义括号来表示括号字符本身。本文将详细介绍如何在Python中实现转义括号的功能。实现步骤......
  • python 抓包ip
    Python抓包IP的实现步骤在Python中,我们可以使用一些第三方库来实现抓包IP的功能,其中比较常用的是scapy库。本文将向你介绍如何使用scapy来实现Python抓包IP的功能。实现步骤下面是实现Python抓包IP的流程,我们可以使用一个表格来展示每个步骤及其对应的代码:步骤描述1......
  • python 柱状图 数值 字体
    Python柱状图:数值与字体柱状图是数据可视化中常用的一种图表类型,它能够直观地展示不同类别的数据之间的比较关系。在Python中,有多种方式可以绘制柱状图,而且可以根据需要对柱状图进行自定义,包括设置数值和字体。Matplotlib库绘制柱状图Matplotlib是Python中最常用的数据可视化库......
  • python 中fill函数
    Python中fill函数的实现作为一名经验丰富的开发者,我很乐意教会新手如何实现Python中的fill函数。在本文中,我将向你展示整个过程的步骤,并为每一步提供相应的代码和注释。整体流程下面的表格展示了实现Python中fill函数的整个流程。步骤描述1创建一个新的字符串2判......
  • python 指定位置创建文件夹
    如何在Python中指定位置创建文件夹介绍在Python编程中,创建文件夹是一个常见的任务。有时候我们需要在特定位置创建一个文件夹,以便存储和组织文件。本文将向刚入行的小白介绍如何使用Python在指定位置创建文件夹。整体流程下面是一个创建文件夹的示例流程,我们将通过一些简单的步......
  • python 直方图比较
    Python直方图比较引言在数据分析和可视化领域,直方图是一种常用的图表类型,用于展示数据的分布情况。Python提供了多种库和方法来生成和比较直方图。在本文中,我将向你介绍如何使用Python实现直方图比较的方法。流程概述下表展示了实现Python直方图比较的步骤概览:步骤描述......
  • python 站点克里金插值(kriging)
    Python站点克里金插值(Kriging)在地理信息系统(GIS)和地质领域中,站点克里金插值(Kriging)是一种常用的空间插值方法。它利用观测点上的数据,通过对空间自相关性的建模,估计未观测位置上的数值。Python提供了一些库和工具,使得实施站点克里金插值变得简单和高效。本文将介绍Python中的站点克......
  • 通过python读取authing IAM中的admin、user审计日志
     方式:通过python-logstash库,将读取的日志传给logstash的udpinput地址。 logstashconfig:input{udp{port=>5959codec=>json}}filter{json{source=>"message"target=>"parsed_data"}mutate{......
  • python读取rds
    Python读取RDSRDS(RelationalDatabaseService)是云计算中提供的一种托管式关系型数据库服务,它能够帮助用户轻松部署、管理和扩展关系型数据库。在Python中,我们可以使用各种库和驱动程序来连接和操作RDS。连接RDS数据库在Python中,我们可以使用第三方库mysql-connector-python来连......