在Python中对象的复制有三种一般的复制,浅拷贝,深拷贝,那么他们有什么区别呢一般的复制
#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]]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
通过以上实践会发现,复制操作就是将lista在内存中指向的地址,也让listb指向他,本身并没有在内存中创建地址。
如果你想学习Python可以来这个群,首先是四七二,中间是三零九,最后是二六一,里面可以免费的学习和交流,也有学习资料可以下载。
浅拷贝
#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
- 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
- 51
- 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
- 51
根据以上实践说明,浅拷贝对对象中对象没有拷贝。
深拷贝
#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]]] #没有受到任何影响
- 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
- 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
时间: 2024-09-08 06:57:09