展开

关键词

Python拷贝与深拷贝

在本文中,将介绍如何在Python 3复制或“克隆”对象,以及所涉及的一些注意事项。 注:本教程是用Python 3编写的,但是在复制对象时,Python 2和3并没有什么区别。 拷贝意味着构建一个新的集合对象,然后用对原始集合的子对象引用填充它。 拷贝 在下面的示例,我们将创建一个新的嵌套列表,然后将其复制到list(): >>> xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> ys = list(xs 这是物体的拷贝和深拷贝之间的实际区别。 现在知道了如何创建一些内置集合类的拷贝,并且了解了拷贝和深拷贝之间的区别。但是我们仍然希望得到答案是: 如何创建内置集合的深拷贝? 这些问题的答案在Python标准库的copy模块里。该模块为创建任意Python对象的拷贝和深拷贝提供了一个简单的接口。 深拷贝 让我们重复前面的列表复制示例,但有一个重要的区别。

27910

python的深拷贝拷贝

python的直接赋值、拷贝和深拷贝很容易让人混淆。 1.赋值 a = ['zero', [1,2,3]] b = a 2.拷贝(shallow copy) import copy c = copy.copy(a) 3.深拷贝(deep copy) d c输出: 'zero', [1, 2, 3, '4']] d输出: ['zero', [1, 2, 3]] 赋值的时候,是直接引用,b与a其实都指向同一个对象,所以当a改变时,b也随机改变; 拷贝的时候 ,a与c独立,但是子对象指向同一对象,a变化时,c列表的子列表[1,2,3]变成了[1,2,3,4]; 深拷贝的时候,完全拷贝a及其子对象,d与a独立,d不随a的变化而变化。

16910
  • 广告
    关闭

    开发者专享福利,1988元优惠券限量发放

    带你体验博客、网盘相册搭建部署、视频渲染、模型训练及语音、文字识别等热门场景。云服务器低至65元/年,GPU15元起

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    python赋值,深拷贝拷贝区别

    拷贝和深拷贝的区别 需要通过 子元素 区分 拷贝:子元素的 引用相同 ? 深拷贝:所以引用都不相同,完全复制一份 ? 这三种不适合 int,str,float,bool等类型。

    81720

    Python赋值、拷贝与深拷贝

    python关于对象复制有三种类型的使用方式,赋值、拷贝与深拷贝。他们既有区别又有联系,刚好最近碰到这一类的问题,研究下。 一、赋值         在python,对象的赋值就是简单的对象引用,这点和C++不同。 二、拷贝(shallow copy) 拷贝会创建新对象,其内容是原对象的引用。         拷贝有三种形式:切片操作,工厂函数,copy模块的copy函数         比如对上述list_a,                 切片操作:list_b = list_a[:]   或者 list_b 三、深拷贝(deep copy)         深拷贝只有一种形式,copy模块的deepcopy函数。 和拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。

    44090

    Python 拷贝和深拷贝的区别

    在本文中,我们将探索什么是深拷贝拷贝。此外,我们还将讨论它们之间的差异以及何时使用其中一种而不是另一种。 不可变对象 vs 可变对象 在进入 Python 拷贝和深拷贝之前,首先要理解可变对象类型和不可变对象类型之间的区别。 >>> id(a) == id(b) True Python 的赋值语句不复制对象,它们在目标和对象之间创建绑定。 拷贝 vs 深拷贝 在深入讨论拷贝和深拷贝的细节之前,请注意,它们的区别只有在我们必须处理本质上是嵌套结构的复合对象时才有意义。换句话说,复合对象是包含其他对象的对象,例如,列表列表或集合字典。 因此,了解如何正确地复制可变对象以避免代码的 bug 非常重要。回想一下,一个拷贝将从原始对象创建一个新对象,但是如果对象包含其他对象,那么内部对象将不会被复制。

    49550

    python拷贝拷贝

    python拷贝拷贝问题: 什么是深拷贝? (个人理解)深拷贝就是将原有的数据一模一样的拷贝一份,然后存到另一个地址,而不是引用地址 什么是拷贝? (个人理解)就是引用地址 (1)用等于号的拷贝都属于拷贝 ? (2)导入copy包用deepcopy进行深拷贝 ? (3)copy包的copy方法有点特殊     copy.copy方法只能对第一层数据进行深拷贝,但是如果要是被拷贝的数据是不可变的,例如元祖则会根据判断进行拷贝 ? ?

    20920

    python 拷贝拷贝

    Python 直接赋值、拷贝和深度拷贝解析 牛客网题目:What gets printed?() 直接赋值:其实就是对象的引用(别名)。 拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。 # 拷贝 >>>a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1, 2, 3]}) >>> a[1].append( 2、b = a.copy(): 拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。 ? b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。 ?

    33420

    Python拷贝拷贝的区别?

    废话不多说,开始今天的题目: 问:说说Python拷贝拷贝的区别? 答:Python如果需要拷贝对象,需要使用标准库的copy模块。而说到copy模块,不得不说的就是深拷贝拷贝。 深拷贝拷贝需要注意的地方就是:可变元素的拷贝拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的。 但是深拷贝不会这样,这个是拷贝相对于深拷贝最根本的区别 。(PS:这句话如果看不懂,请先看下面的代码演示,回过头来再看,就比较好理解了 。) 改变原始对象为可变类型的元素的值,会同时影响拷贝对象; 改变原始对象为不可变类型的元素的值,不会响拷贝对象。 import copy #定义一个列表,其中第一个元素是可变类型。 list1[1] = 'ge'; print(list2); #结果:复制对象没发生变了 [[1, 2], 'fei', 66] Python深浅拷贝总结: 1,深浅拷贝都是对源对象的复制,占用不同的内存空间

    13940

    Python拷贝拷贝

    仅供学习参考,转载请注明出处 深拷贝拷贝 1. 拷贝 拷贝是对于一个对象的顶层拷贝 通俗的理解是:拷贝了引用,并没有拷贝内容 ? 说明: b = a 符合拷贝的规则。 思考:既然拷贝都是指向同一个内存地址,那么是不是修改一个变量的话,是不是另一个变量指向的值都会一起修改呢? ,虽然 b = a 的确属于拷贝的一种,但是拷贝 c = copy.copy(a) 也是属于拷贝的另一种,那么为什么内存不一样呢? 进一步理解深拷贝 从前面拷贝的例子,我们来看看使用深拷贝有什么变化。 注意点 拷贝对不可变类型和可变类型的copy不同 copy.copy对于可变类型,会进行拷贝 copy.copy对于不可变类型,不会拷贝,仅仅是指向 # 拷贝list可变类型 In [34]: a

    43130

    Python拷贝与深拷贝的骚操作

    【例子】拷贝与深拷贝 list1 = [123, 456, 789, 213] list2 = list1 list3 = list1[:] print(list2) # [123, 456, 为什么同样是list3 = list1[:] 执行list1.sort() 操作,list3不发生变化 执行list1[0][0] = 111 操作,list3发生变化 首先我们先了解到python拷贝拷贝和深拷贝之分 和深拷贝的表现是一样的 ---- 结合上面的例子,我们发现,对二维列表的第一维数据做修改时,使用 = 进行赋值,对X的修改会影响Y,使用 [:] , copy.copy() , copy.deepcopy 如果是对二维列表的第一维数据做增加或者删除操作呢? 二', '维', '度'], 9, 11] 深拷贝X列表给K为 : [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11] 我们发现,对二维列表的第一维数据做增加或者删除操作

    23450

    python拷贝拷贝

    python的可变对象包括:list、dict、set。  python的赋值语句不会创建对象的拷贝,仅仅只是将变量名称绑定到一个对象上。 拷贝:通常指构造一个新的集合对象,然后用原始对象的找到的子对象的引用来填充它。浅层的复制只有一层深度,复制过程不会递归,所以不会创建子对象本身的副本。 创建拷贝 仍以python列表为例,通常我们会用list()函数来复制一个列表,这个复制过程,就是一个拷贝。代码示例: ? 可以看到,通过拷贝方式,确实是复制了一个列表。 这是因为拷贝没有递归复制原始对象的值,只复制了第一层,因此拷贝对象复制了子对象的引用,并没有复制子对象的值。 创建深拷贝 python标准库的copy模块提供了创建python对象的拷贝和深拷贝的接口。使用deepcopy()函数,可以创建一个对象的深拷贝。代码示例: ?

    22220

    python拷贝和深拷贝

    python的赋值是按引用来传递的,如果不是赋值而是拷贝,那就需要用到copy模块了,这就不得不谈拷贝和深拷贝了。 拷贝copy() #! is my_list: False       dup == my_list: True dup[0] is my_list[0]: False dup[0] == my_list[0]: True 拷贝和深拷贝都是 拷贝和深拷贝都是为后续操作而区分的。 ['d', 'e', 'x']] ['a', 'b', 'c', ['d', 'e']] ['a', 'b', 'c', ['d', 'e', 'x'], 'f'] 从这就能看出来,就以列表为例,如果拷贝 对于深拷贝来说没有任何改变,因为深拷贝是新建一个列表,把原列表的内容原封不动拷过来,拷过来以后它和原列表一模一样,至于原列表后来做了什么改变根本不关它的事。形象理解就是拷贝是活的,深拷贝是死的。

    16540

    图解 Python 拷贝与深拷贝

    Python 的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象。 本文将以图文方式介绍 Python 复制或“克隆”对象的操作。 首先介绍一下 Python 拷贝与深拷贝的区别: 拷贝拷贝意味着构造一个新的集合对象,然后用原始对象中找到的子对象的引用来填充它。从本质上讲,浅层的复制只有一层的深度。 赋值与引用 在开始拷贝与深拷贝前,我们先来看一下 Python 的赋值与引用。 使用 Python 标准库的 copy 模块可以创建深拷贝,这个模块为创建任意 Python 对象的拷贝和深拷贝提供了一个简单的接口。

    38131

    python之深拷贝拷贝

    1.当拷贝的是不可变数据类型(数值、字符串、元组),不管是深拷贝拷贝,都指向的是同一地址; ? 2.当拷贝的对象是可变数据类型(列表、字典): (1)当拷贝的对象无复杂子对象,原来值的改变不会影响拷贝的值,同时拷贝值的改变不会影响原来的值。原来值的id和拷贝出来对象的id不同。 (2)当拷贝的对象中有复杂子对象,(例如列表的一个子元素是一个列表),改变原来的值 的复杂子对象的值 ,会影响浅复制的值,但它们各自的id没变。 (3)当深拷贝时,完全独立,包括内存列表和字典。 ? ?

    17420

    Python 变量的多种复制方法(常规拷贝拷贝,深拷贝

    常规拷贝 大家常用的变量复制方法,用“=”就行。 但是!但是!但是! 在我们复制字典和列表时会和我们预想的不一致 接下来,做个小实验 常规拷贝在原始变量 x 的改变后,因为共用同一个内存地址,因此会直接放到被复制的变量 y 上,导致“不知情”的情况下导致 y 变量在没有操作的情况下改变 拷贝 解决办法就是使用拷贝 拷贝会将两个变量分别放在不同的内存地址,解决了常规拷贝的缺点。 深拷贝 但是,对于字典或列表中有嵌套的情况,拷贝同样不会生效。 这时候就需要用的深拷贝。 可以看到,深拷贝可以解决嵌套情况下,变量值的有效隔离。

    30320

    Python拷贝和深拷贝的区别总结与

    单层拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # 内存地址相同 a = [1,2] # 可变数据类型 copy_a = copy.deepcopy(a) print(id(a),id(copy_a)) # 内存地址不相同 结论一: 不管深拷贝还是拷贝对不可变数据类型都是引用内存地址 不管深拷贝还是拷贝对可变数据类型都是会重新创建新的内存空间 拷贝嵌套 # -----------不可变数据类型--------- # 情况一,内嵌可变数据类型 import copy a = 外层是可变数据类型、不管内层是否可变都会创新新的内存地址、但是内部如果为可变则递归创建、不可变则为引用地址 总结: 拷贝拷贝只做最顶层的数据类型判断 如果顶层是可变类型则创建新的内存空间 如果顶层是不可变数据类型就是引用拷贝拷贝: 深拷贝做递归拷贝,可以递归拷贝所有的内部嵌套数据(可以理解为循环遍历做拷贝判断) 深拷贝递归拷贝遇到可变类型则创建新的内存空间 深拷贝递归拷贝遇到不可变数据类型就是拷贝的引用

    28330

    聊一聊Python拷贝和深拷贝

    l1 = [1, 2, 3] l2 = list(l1) l1.append(4) print(l1, l2) # [1, 2, 3, 4] [1, 2, 3] 那这里的l2 = list(l1)是拷贝还是深拷贝 拷贝 拷贝的方法主要有三种,通过数据构造器(list、set)、切片,或者copy.copy()的方法。 import copy l1 = [1, 2, 3] l2 = list(l1) l3 = l1[:] l4 = copy.copy(l1) 拷贝意味着构造一个新的集合对象,然后用原始对象中找到的子对象的引用来填充它 3] l2 = list(l1) l1.append(4) l1[0].append(5) print(l1, l2) # [[1, 2, 5], 3, 4] [[1, 2, 5], 3] 由于拷贝是赋值一层 ,所以l1.append(4)不会影响l2,但第二层其实是对l1的引用,所以在嵌套列表修改会影响l2。

    14310

    Python|赋值、拷贝与深拷贝

    因此,在python,对对象的赋值都是对象的引用地址的传递(变量传递是传引用而不是传值)。 拷贝与深拷贝 先从概念上来区分拷贝与深拷贝。 注意:在python拷贝与深拷贝的不同仅仅是对组合对象而言,所谓的组合对象就是指包含其他对象的对象,比如列表、类等。 a=”abc”b=copy.deepcopy(a) #深拷贝a is b #返回True 下面通过组合对象来看看深拷贝拷贝的区别 #拷贝import copya=[11,’abc’,[‘python ( id (a[0]) , id (b[0]) ) #返回a[0]、b[0]内存地址,相同 拷贝会创造一个新的对象,上述例子“a is not b”。

    34320

    python拷贝与深拷贝

    拷贝 拷贝是对于一个对象的顶层拷贝 通俗的理解是:拷贝了引用,并没有拷贝内容 In [10]: a = [11,22,33] In [11]: b = a In [12]: id(a) Out[ 再看下面的代码,进一步理解拷贝与深拷贝: ? 由于变量e用的是copy.copy(c)的方法,所以只拷贝了列表[a,b]的引用(copy.copy只能拷贝第一层引用),所以变量c与变量e的内存地址是不同的,但当改变[a,b]列表a列表的值时,发现 e变量的a列表也会改变,说明copy.copy方法只拷贝了列表[a,b]列表的引用,而没有拷贝列表[a,b]列表a与列表b的引用。 实际上列表[a,b]的两个列表a,b的内存地址还是指向的a与b copy元组时的特点 ?

    25720

    java拷贝和深拷贝的区别_python拷贝和深拷贝

    那么对对象A进行拷贝操作赋值给对象B就是:B.a=A.a; B.b=A.b; 在程序拷贝对象是很常见的,主要是为了在新的上下文环境复用现有对象的部分或全部 数据。 Java的对象拷贝主要分为:拷贝(Shallow Copy)、深拷贝(Deep Copy)。 先介绍一点铺垫知识:Java的数据类型分为基本数据类型和引用数据类型。 在这种情况下,在一个对象修改该成员变量会影响到另一个对象的该成员变量值。 拷贝的实现方式主要有三种: 一、通过拷贝构造方法实现拷贝拷贝构造方法指的是该类的构造方法参数为该类的对象。 要注意:如果在拷贝构造方法,对引用数据类型变量逐一开辟新的内存空间,创建新的对象,也可以实现深拷贝。而对于一般的拷贝构造,则一定是拷贝。 ,这个方法就是进行的拷贝

    3910

    相关产品

    • 人体分析

      人体分析

      人体分析包含人像分割、人体识别、行人重识别(Reid)等服务。人像分割可识别视频、图片中的半身人体轮廓,并将其与背景分离;人体检测,可识别行人的穿着、体态、发型等信息;行人重识别(Reid)可实现跨摄像头跨场景下行人的识别与检索。可应用于人像抠图、背景特效、行人搜索、人群密度检测等场景。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券