原链接:(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,则传的是值。
三 Shallow copy和Deep copy的区别a = 123 #创建一个值为123的对象 b = 123 #增加123的引用计数 a = 111 #创建一个值为111的对象,减少123的引用计数 b = a #增加111的引用计数 c = [] #创建一个空队列 d = [] #创建一个新的空队列 c = [] #再创建一个新的空队列,减少原队列的引用计数 c = d #增加d队列的引用计数,减少c队列的引用计数 c.append(1) #创建一个值为1的对象,不改变原队列的引用计数
Python document中是这么说的:
- A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
- A 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 copy a = [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]