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

来源:互联网 发布:淘宝的代购可信吗 编辑:程序博客网 时间:2024/05/01 14:20

在平时项目中,我们经常需要对变量或者数组进行复制操作,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 = 10b = aa =20a=[1,2,3,4]b=a   #b是a的一个引用print (b is a) # Trueb[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 copya = [1, 2, 3, 4, ['a', 'b']]  #原始对象b = a  #赋值,传对象的引用c = copy.copy(a)  #对象拷贝,浅拷贝d = copy.deepcopy(a)  #对象拷贝,深拷贝a.append(5)  #修改对象aa[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']]



0 0
原创粉丝点击