比较赋值、浅拷贝、深拷贝

1、无论是浅拷贝还是深拷贝,拷贝对象后是否会开辟新内存,取决于被拷贝对象的数据类型是否可变,一般来讲,可变的数据类型会开辟新内存,不可变数据类型反之不会开辟新内存,进行内存地址的引用(-5-256以外的大整数池会开辟内存,注:但我本地进行测试比较内存还是一样的,有问题)

2、要在单层、嵌套型对象中逐一比较拷贝

3、浅拷贝和深拷贝的区别主要体现在对嵌套型结构的拷贝上

复制代码
 1 import copy
 2 
 3 print("================赋值==================")
 4 prototype_lst = [1, 2, 5, [78, 90]]
 5 a = prototype_lst
 6 prototype_lst.append(9)
 7 print(prototype_lst, a)
 8 
 9 print("================浅拷贝==================")
10 prototype_lst.pop(-1)
11 shallow_b = prototype_lst.copy()
12 # 原始列表子对象发生变化,拷贝对象后内部子对象也跟着改变
13 prototype_lst[-1].append(100)
14 print("原始列表:", prototype_lst, "拷贝后列表:", shallow_b)
15 
16 print("================深拷贝==================")
17 deep_b = copy.deepcopy(prototype_lst)
18 # 原始列表子对象发生变化,拷贝对象后内部子对象不变
19 prototype_lst[-1].append(0)
20 print("原始列表:", prototype_lst, "拷贝后列表:", deep_b)
21 
22 # 不可变数据类型的浅拷贝和深拷贝
23 prototype_tuple = (1, 2)
24 shallow_c = copy.copy(prototype_tuple)
25 deep_c = copy.deepcopy(prototype_tuple)
26 print(id(shallow_c) == id(deep_c))
复制代码

output:

  ================赋值==================
  [1, 2, 5, [78, 90], 9] [1, 2, 5, [78, 90], 9]
  ================浅拷贝==================
  原始列表: [1, 2, 5, [78, 90, 100]] 拷贝后列表: [1, 2, 5, [78, 90, 100]]
  ================深拷贝==================
  原始列表: [1, 2, 5, [78, 90, 100, 0]] 拷贝后列表: [1, 2, 5, [78, 90, 100]]
  True

 总结:嵌套序列的深拷贝内部子对象之所以不会发生改变,我理解就是内部子对象也开辟了一块内存,就是开辟的够彻底也就是深

posted on   默玖  阅读(33)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示