Python学习笔记之浅拷贝和深拷贝

简介: 在Python中对象的复制有三种一般的复制,浅拷贝,深拷贝,那么他们有什么区别呢

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

相关文章
|
24天前
|
存储 C语言 Python
【Python】学习笔记day3
【Python】学习笔记day3
27 1
|
4月前
|
SQL 分布式计算 大数据
Python+大数据学习笔记(一)
Python+大数据学习笔记(一)
43 0
|
21天前
|
运维 Python
【Python】python深拷贝与浅拷贝详解(必须掌握)
【Python】python深拷贝与浅拷贝详解(必须掌握)
|
6天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
24天前
|
存储 C语言 芯片
【Python】学习笔记day1
【Python】学习笔记day1
33 1
|
1月前
|
算法 搜索推荐 测试技术
python排序算法及优化学习笔记1
python实现的简单的排序算法,以及算法优化,学习笔记1
33 1
|
1月前
|
Python
请简述Python中的深拷贝和浅拷贝的区别?并举例说明。
【2月更文挑战第25天】【2月更文挑战第84篇】请简述Python中的深拷贝和浅拷贝的区别?并举例说明。
|
1月前
|
安全 Python
Python中的深拷贝和浅拷贝的区别
Python中的深拷贝和浅拷贝的区别
15 0
|
1月前
|
Python