关于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]