>>> [id(x) for x in person,hus,wif ]
[3077489356L, 3077491084L, 3077491340L]
>>> hus[0]='j'
>>> wif[0]='s'
>>> hus,wif
(['j', ['savings', 100.0]], ['s', ['savings', 100.0]])
>>> hus[1][1]=50.00
>>> hus,wif
(['j', ['savings', 50.0]], ['s', ['savings', 50.0]])
序列类型对象的浅拷贝是默认类型拷贝,并可以以下几种方式实施:(1)完全切片操作[:],(2)利用工厂函数,比如list(),dict()等,(3)使用copy 模块的copy 函数.
第一个对象是不可变的(是个字符串类型),而第二个是可变的(一个列表).正因为如此,当进行浅拷贝时,字符串被显式的拷贝,并新创建了一个字符串对象,而列
表元素只是把它的引用复制了一下,并不是它的成员.
copy.deepcopy()
>>> h=person
>>> import copy
>>> w=copy.deepcopy(person)
>>> [id(x) for x in person,h,w]
[3077489356L, 3077489356L, 3076713036L]
>>> h[0]='a'
>>> w[0]='q'
>>> h,w
(['a', ['savings', 50.0]], ['q', ['savings', 50.0]])
>>> h[1][1]=20.0
>>> h,w
(['a', ['savings', 20.0]], ['q', ['savings', 50.0]])
第一,非容器类型(比如数字,字符串和其他"原子"类型的对象,像代码,类型和xrange 对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的.
第二,如果元组变量只包含原子类型对象,对它的深拷贝将不会进行.如果我们把账户信息改成元组类型,那么即便按我们的要求使用深拷贝操作也只能得到一个浅拷贝:
copy()进行浅拷贝操作,而deepcopy()进行深拷贝操作.