Python中的Copy和Deepcopy

来源:互联网 发布:unity3d粒子系统教程 编辑:程序博客网 时间:2024/05/01 18:36

原链接:(http://www.cnblogs.com/nobkb/p/3322684.html)

一 Python的对象:

  Python存在大量的对象,我们一般提到的对象都是C中的结构体在堆中申请的一块内存(以CPython为例),每一个对象都有ID,可以通过ID(Object)获得。对象的范围包括内建类型的对象(如int类型的对象123,str的对象"test",list的对象[],生成器对象等等)、用户自建类型的对象、函数(lambda函数,生成器函数)、类型、Ture、False(bool类型的对象)、None(NoneType的对象)。

二,Python的引用计数:

  所有对象都采用引用计数,给对象分配新名词或者将其放入容器中,这个对象的引用计数都会增加。当离开作用域或者被重新赋值的时候,这个对象的引用计数就会减少。当减少为0,垃圾收集器会将其销毁。

  Python中的对象分为immutable和mutabel,作为immutable的int、char和tuple,相同的值在内存中只会生成一次,每次将其赋值到变量中,便会增加一个引用计数。而作为mutable的list、dict、xrange(生成器)和lambda(函数),每次生成都会在内存中生成一个新的对象。

  另外:传参的时候,若参数为mutable,则传的是引用,若参数为immutable,则传的是值。

a = 123     #创建一个值为123的对象b = 123     #增加123的引用计数a = 111     #创建一个值为111的对象,减少123的引用计数b = a       #增加111的引用计数c = []      #创建一个空队列d = []      #创建一个新的空队列c = []      #再创建一个新的空队列,减少原队列的引用计数c = d       #增加d队列的引用计数,减少c队列的引用计数c.append(1) #创建一个值为1的对象,不改变原队列的引用计数
三 Shallow copy和Deep copy的区别

  Python document中是这么说的:

  • shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
  • deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original. 

  这其中的区别就是浅复制会简单的复制引用,不管他是mutable还是immutable。而深复制则会递归地复制immutable对象引用,对于mutable,则会新建一个对象。

import copya = [1, 2]b = [a, 3]c = copy.copy(b)        #c = [[1, 2], 3]d = copy.deepcopy(b)    #d = [[1, 2], 3]a.append(3)             #c = [[1, 2, 3], 3]                        #d = [[1, 2], 3]



原创粉丝点击