python copy & deepcopy

摘要:
1 python中的一切事物皆为对象,并且规定参数的传递都是对象的引用。
2  python参数传递都是“传对象引用”方式。实际上相当于c++中传值和传引用的结合。
3 如果函数收到的是可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值”来传递对象。
>>> a = 1
>>> b = 1
>>> id(a)
15106392
>>> id(b)
15106392
id(a) = id(b)

>>> a = [1]
>>> b=[1]

>>> id(a)
140657598496424
>>> id(b)
140657598578128
id(a) != id(b)

>>> a= b
>>> id(a)
140657598496424
>>> id(b)
140657598578128
id(a)=id(b)

1.浅拷贝(copy()):对对象进行拷贝,并生成新的对象,但对象中的元素只会使用原始对象中的引用

>>> d=copy.copy(a)
>>> a.append(8)
>>> a,d
([1, 2, 4, 5, 6, ['a', 'b', 'c'], 7, 8], [1, 2, 4, 5, 6, ['a', 'b', 'c'], 7])
>>> a[5].append('d')
>>> a,d
([1, 2, 4, 5, 6, ['a', 'b', 'c', 'd'], 7, 8], [1, 2, 4, 5, 6, ['a', 'b', 'c', 'd'], 7])

2.深拷贝(deepcopy()):会生成一个新对象,对象中的元素也会重新生产成一份

>>> a=[1,2,[1,2]]
>>> d=copy.deepcopy(a)
>>> a.append(3)
>>> a,d
([1, 2, [1, 2], 3], [1, 2, [1, 2]])
>>> a[2].append(3)
>>> a,d
([1, 2, [1, 2, 3], 3], [1, 2, [1, 2]])

*对于非容器类型没有拷贝这一说法

*对于元组变量中只包含原子类型的元素不能进行深拷贝

 

知识补充:  

内存模型

依据变量在内存中的组织分类。Python的类型, 就象绝大多数其它语言一样,能容纳一个或多个值。一个能保存单个字面对象的类型我们称它为原子或标量存储,那些可容纳多个对象的类型,我们称之为容器存储。(容器对象有时会在文档中被称为复合对象,不过这些对象并不仅仅指类型,还包括类似类实例这样的对象)

分类                Python 类型
标量/原子类型         数值(所有的数值类型),字符串(全部是文字)
容器类型             列表、元组、字典

 

posted @ 2015-09-20 18:06  chaserchen  阅读(335)  评论(0编辑  收藏  举报