网上关于Python的深拷贝和浅拷贝的文章很多,这里对三种拷贝进行比较并附实例,大家可以参考下
一般的复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#encoding:utf-8
#定义一个嵌套集合
lista = [ 1 , 2 , 3 ,[ 4 , 5 , 6 ,[ 7 , 8 , 9 ]]]
listb = lista
#分别打印出 lista和listb的地址值
print id (lista) #4511103096
print id (listb) #4511103096
#修改lista中的内容,listb中的内容也会跟着修改
lista[ 0 ] = 0
print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
print listb #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
|
通过以上实践会发现,复制操作就是将lista在内存中指向的地址,也让listb指向他,本身并没有在内存中创建地址。
浅拷贝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#encoding:utf-8
#定义一个嵌套集合
import copy
lista = [ 1 , 2 , 3 ,[ 4 , 5 , 6 ,[ 7 , 8 , 9 ]]]
#使用copy模块中copy方法
listb = copy.copy(lista)
print id (lista) #4396231640
print id (listb) #4396231712
#发现lista和listb在内存中的地址有区别,
#打印元素中的第一个元素的地址值
print id (lista[ 0 ]) #140666751466536
print id (listb[ 0 ]) #140666751466536
#元素的地址值是一样的,是不是意思就是,改变lista中的第一个元素,
# listb中的也要改变呢
lista[ 0 ] = 0
print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]
#结果发现,竟然没有跟着lista一起改变,为什么呢,因为使用了浅拷贝呗
#我们在打印下lista[0]和listb[0]的地址
print id (lista[ 0 ]) #140666751466560
print id (listb[ 0 ]) #140666751466536
#会发现lista[0]重新指向内存中的其他地址
#这时候可以通过以上的方法,修改lista[3],lista[3]也是一个list
print id (lista[ 3 ]) #4499779240
print id (listb[ 3 ]) #4499779240
#修改lista[3]中第一个元素呢
lista[ 3 ][ 0 ] = 0
print lista #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]
print listb #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]
#发现修改lista[3][0]元素的值,listb[3][0]也会跟着改变
|
根据以上实践说明,浅拷贝对对象中对象没有拷贝。
深拷贝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#encoding:utf-8
#定义一个嵌套集合
import copy
lista = [ 1 , 2 , 3 ,[ 4 , 5 , 6 ,[ 7 , 8 , 9 ]]]
#深拷贝功能是在浅拷贝上做的加强,所以具备浅拷贝的功能
listb = copy.deepcopy(lista)
lista[ 3 ][ 0 ] = 0
print lista #[1, 2, 3, [0, 5, 6, [7, 8, 9]]]
print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]
#深拷贝会解决修改lista[3][0]值不会影响listb中的值
#再来修改下第三层列表中元素是不是也完成拷贝
lista[ 3 ][ 3 ][ 0 ] = 0
print lista #[1, 2, 3, [0, 5, 6, [0, 8, 9]]]
print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]
#没有受到任何影响
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/baidu_31956557/article/details/75142594