您的位置:首页 > 编程语言 > Python开发

python知识点(三):复制(引用、拷贝、浅拷贝和深拷贝)

2015-04-03 15:24 162 查看
在平时项目中,我们经常需要对变量或者数组进行复制操作,python内部对于复制操作有着自己一套规定,很多情况下容易发生错误使用的情况。以下对复制操作的一个总结。

1) 引用和拷贝(references and copies)

当程序中使用赋值操作符=时,对于不可变对象(If the value cannot be modified, the object is said to be immutable, like string,numbers),a作为b的一个拷贝被创建,a和b将指向不同的内存地址,a和b相互独立;但是对于可变的对象(If an object’s value can be modified, the object is said to be mutable,like list, set, dictionary),a作为b的一个引用被创建,a和b的元素公用相同的内存地址,a和b的元素共享。如:#coding: utf-8
a = 10
b = a
a =20
a=[1,2,3,4]
b=a #b是a的一个引用
print (b is a) # True
b[2] = -100
print (a) # [1,2,-100,4]

二、深拷贝和浅拷贝(shallow copy and deep copy)

为了避免可变对象指向同一个对象,必须创建一个新的拷贝,而不是引用。在python中可以对容器对象(An object that contains references to other objects is said to be a container or collection)使用两种拷贝:浅拷贝和深拷贝。浅拷贝使用copy模块中copy()函数创建一个新的对象,但是使用原来对象的元素的引用(如果是不变类型,相当于是拷贝)来填充新对象。深拷贝使用deepcopy()函数来创建一个新的对象,同时递归地拷贝对象所包含的所有的元素。换句话说
copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。copy.deepcopy 深拷贝 拷贝对象及其子对象。举例如下:#coding: utf-8
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝
a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象
print a # [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print b # [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print c # [1, 2, 3, 4, ['a', 'b', 'c']]
print d # [1, 2, 3, 4, ['a', 'b']]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: