python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝。
要理解浅拷贝,必须先弄清楚python中的引用。
这是一个普遍的法则。能够说 Python 没有赋值,仅仅有引用。
如。a=1,变量a仅仅是整数对象1的引用。
当对象的内容发生变化时。变量的对象引用是不会变化的。如以下的样例。
(1)没有限制条件的分片表达式(L[:])可以复制序列,但此法仅仅能浅层复制。
(2)字典 copy 方法。D.copy() 可以复制字典,但此法仅仅能浅层复制
(3)有些内置函数。比如 list,可以生成拷贝 list(L)
(4)copy 标准库模块可以生成完整拷贝:deepcopy,递归 copy
详细点说就是。浅拷贝是指拷贝的仅仅是原对象元素的引用,换句话说,浅拷贝产生的对象本身是新的,可是它的内容不是新的,仅仅是对原子对象的一个引用。
import copy aList=[[1,2],3,4] bList=copy.copy(aList) print aList print bList print id(aList) print id(bList) aList[0][0]=5 print aList print bList
那么3,4两个元素呢?这就要讲讲python中的可变对象和不可变对象的引用了。
import copy aList=[[1,2],3,4] bList=copy.copy(aList) print aList print bList print id(aList[1]) print id(bList[1]) aList[2]=5#变量的对象引用改变了而已 aList[0]=[0,1,1]#变量的对象引用改变了而已 print aList print bList
import copy aList=[[1,2],3,4] bList=aList cList=copy.copy(aList) dList=copy.deepcopy(aList) print aList print bList print cList print dList print id(aList) print id(bList) print id(cList) print id(dList) aList.append(5) aList[0].append('hello') print aList print bList print cList print dList