关于python浅拷贝和深拷贝的问题

python 中,浅拷贝可以使用以下几种方式实施:(1)完全切片操作[:],(2)利用工厂函数,比如 list(),dict()等,(3)使用 copy 模块的 copy 函数.
例如:

View Code
>>> person = ['name', ['savings', 100.00]]
>>> hubby = person[:] # slice copy
>>> wifey = list(person)  # fac func copy
>>> [id(x) for x in person, hubby, wifey]
[11826320, 12223552, 11850936] 


这上面的例子中,如果改动某个变量的name部分,是不会影响其他的,但是如果改动savings部分就会有影响,因为string类型是不可变类型,所以当改
动的时候它是指向了一个新的变量,但是list是可变类型,因此改动其中的内容的时候指向的依然是同一个地址,因此就会影响到其他两个变量的值.
想要实现深复制,则要引入copy,再调用wifey = copy.deepcopy(person)这个方法这个时候的wifey就和person和hubby完全隔离开了.

以下有几点关于拷贝操作的警告。第一,非容器类型(比如数字,字符串和其他"原子"类型的
对象,像代码,类型和 xrange 对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的.第二,
如果元组变量只包含原子类型对象,对它的深拷贝将不会进行.如果我们把账户信息改成元组类
型,那么即便按我们的要求使用深拷贝操作也只能得到一个浅拷贝:

View Code
1 >>> person = ['name', ('savings', 100.00)]
2 >>> newPerson = copy.deepcopy(person)
3 >>> [id(x) for x in person, newPerson]
4 [12225352, 12226112]
5 >>> [id(x) for x in person]
6 [9919616, 11800088]
7 >>> [id(x) for x in newPerson]
8 [9919616, 11800088] 

posted on 2012-09-09 00:17  saobchj  阅读(482)  评论(0编辑  收藏  举报

导航