python的拷贝(深拷贝和浅拷贝)

  今天看了几篇关于python拷贝的博文,感觉不太清楚,所以我就自己做实验试一下,特此记录。

  拷贝是针对组合对象说的,比如列表,类等,而数字,字符串这样的变量是没有拷贝这一说的。

  实现拷贝有:

      1.工厂函数

      2.切片操作

      3.对象的copy方法

      4.copy模块的copy方法

  Notice:在python2.2之后将一些原来的内建函数和一些没有的内建函数转换成了工厂函数,而这些内建函数一些现在仍然有。

      工厂函数虽然貌似函数,但它是一个类。

      内建函数大概有这些(未详细考证):

                        int(),long(), float(), complex()   

                        str(), unicode(), basestring()       

                        list(), tuple()

                        type()

                        dict(), bool(),set(), frozenset(),object(),classmethod(),staticmethod(),super(),property(),file()

      

  • “基本”是指这些类型都是Python提供的标准或者核心类型;
  • “内建”是由于这些类型是Python默认就提供的;
  • “数据”是因为他们用于一般数据存储;
  • “对象”是因为对象是数据和功能的默认抽象;
  • “原始”是因为这些类型提供的是最底层的粒度数据存储;
  • “类型”是因为他们就是数据类型

        python默认的拷贝类型是浅拷贝

        浅拷贝就是对象是新的对象,但是内部的元素是对原对象的引用。请看图

        

      可以看出a,b,c,d其本身的id并不相同但是其内部元素的id却是一样的。

      而深拷贝就是对象与对象内部元素都与原对象没有任何关系,在拷贝的时候,对象被创建以后会递归拷贝原对象内部元素。

      

    是不是对象本身与对象内部元素的id都不同啊。

      

      

      

  

时间: 2024-12-16 07:37:29

python的拷贝(深拷贝和浅拷贝)的相关文章

Python对象拷贝——深拷贝与浅拷贝

对象赋值 浅拷贝 深拷贝 1. 对象赋值 对象的赋值实际上是对对象的引用.也就是说当把一个对象赋值给另一个对象时,只是拷贝了引用.如: >>> t1 = tuple('furzoom') >>> t2 = t1 >>> id(t1),id(t2) (139792198303936, 139792198303936) 上面t1和t2代表的是同一个对象. 2. 浅拷贝 除了上面将一个对象直接赋值给另一个对象外,还有两种常用的方法对对象进行拷贝:使用切片操作

**Python中的深拷贝和浅拷贝详解

Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/

python中的深拷贝和浅拷贝

1.深拷贝VS浅拷贝 python中的深拷贝和浅拷贝和java里面的概念是一样的, 所谓浅拷贝就是对引用的拷贝 (里面的数据不拷贝出来,其中的数据与原对象里面数据用的是相同的地址空间) 所谓深拷贝就是对对象的资源的拷贝 (里面的数据拷贝出来.深拷贝有自己的存储空间,有自己定义的数据,跟原对象一点关系也没有) 2.对赋值的认识: 赋值:将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ) 修改不可变对象(str.tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空

python学习系列--深拷贝和浅拷贝

概念 普通情下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用.把新的对象置于新的内存空间中,才是拷贝.在python中,深浅拷贝的区别实际上是拷贝的深度不同. 操作 常见的'='号就是一种拷贝方式.python在复制对象时实际上是调用copy模块的copy方法,即copy.copy().而使用deepcopy()函数操作就是深拷贝.对于字符串和数字来说,不管是深拷贝还是浅拷贝,都只是在原有内存地址上的新引用,所以是没有区别的.可

python中的深拷贝和浅拷贝理解

在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用.以下分两个思路来分别理解浅拷贝和深拷贝: 利用切片操作和工厂方法list方法拷贝 利用copy中的deepcopy方法进行拷贝 1.利用切片操作和工厂方法list方法拷贝 代码场景:有一个小伙jack,tom通过切片操作拷贝jack,anny通过工厂方法拷贝jack. >>> jack = ['jack', ['age', 20]] &g

python list的深拷贝与浅拷贝-以及初始化空白list的方法(2)

接上一篇 其实python对于深拷贝与浅拷贝的处理方式依然是很灵活的,甚至有一个专门的工具包copy来做个事情 来看以下这组list的拷贝方法: 已知lista是一个已经定义好了的list listb=lista 注意,这个并不是一个copy的过程,这里lista与listb完全等同 以下提供一些copy方法,但注意是深copy还是浅copy: 定义:lista=[2,[4,5]] listb=lista[:] listb=list(lista) listb=[i for i in lista]

python序列的深拷贝和浅拷贝

python中的不可变类型 列举:数值,字符串.元组.字节串 数值及字符串“可变”'的假象 num = 123 mystr = 'abc' print(id(num), num) print(id(mystr), mystr) num = 456 mystr = 'def' print('修改后...') print(id(num), num) print(id(mystr), mystr) # 结果: 140704113688128 123 1853358409744 abc 修改... 18

Python中的深拷贝与浅拷贝

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象,而是直接引用,也就是类似于添加了一个链接而已,两个变量指向的是同一块内存地址. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象.是会开辟一个新的内存,存放数据,就是两块不同内存. import copy li = [1,1,2,3,4,5,6,7,7,8] #li2=li #两个list地址是一样的,称为浅拷贝 # li2=li[:] #复制成一

Python中的深拷贝和浅拷贝区别

首先,我们知道Python3中,有6个标准的数据类型,他们又分为可变和不可变. 不可变:Number(数字).String(字符串).Tuple(元组). 可以变:List(列表).Dictionary(字典).Set(集合). 浅拷贝 copy模块里面的copy方法实现. 浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象:改变原始对象中为不可变类型的元素的值,不会响拷贝对象. 代码演示 import copy class Father(object): def __init__

python list的深拷贝与浅拷贝-以及初始化空白list的方法(1)

在一次做题的时候遇到了一件令人非常匪夷所思的"bug":我想要做的事情是,初始化shape确定,但值为"空"的list,并且是一个二维的list,开始我是这么做的: l1=[[""]*3]*3 print l1 [['', '', ''], ['', '', ''], ['', '', '']] 可以看到这个矩阵的shape,可以理解成一个N*N的矩阵. 把题目也贴出来吧--题目要求很简单,输入一个N*N的矩阵,输出这个矩阵的顺时针旋转90°之后