深浅拷贝

深浅拷贝

【一】深浅拷贝问题

给一个列表 基于这个列表进行更改生成新列表

方法1: 复制

对原来的列表不生效

num_list = [1, 2, 3]
num_list_new = [1, 2, 3]
num_list_new.append(4)

print(num_list)
print(num_list_new)

[1, 2, 3]
[1, 2, 3, 4]

方法2:用新的变量名指向原来的列表

对新列表和原来的列表都生效

num_list = [1, 2, 3]
num_list_new = num_list
num_list_new.append(4)

print(num_list)
print(num_list_new)

[1, 2, 3, 4]
[1, 2, 3, 4]

【二】复制原本的列表会产生的问题

新列表是复制出来的副本

【1】修改新列表会影响到原本的列表

----->浅拷贝

【2】修改新列表不会影响原本的列表

----->深拷贝

【三】在python代码中实现深浅拷贝

导入模块

【1】浅拷贝

import copy

# 必须是修改源数据类型中的可变数据类型才生效
# copy.copy()
num_list = [1, 2, 3, 4,[1,2,3]]
num_list_new = copy.copy(num_list)

# 当新列表在列表中的可变数据中改变时,旧的列表也会随之改变
num_list_new[4].append(5)

print(num_list_new,id(num_list_new))
print(num_list,id(num_list))

#id 不同 不是同一个列表
[1, 2, 3, 4, [1, 2, 3, 5]] 1558382145920
[1, 2, 3, 4, [1, 2, 3, 5]] 1558382145664

# 当新列表在列表中的不可变数据中改变时,旧的列表不会变

num_list_new.append(5)

print(num_list_new,id(num_list_new))
print(num_list,id(num_list))

[1, 2, 3, 4, [1, 2, 3], 5] 1553318834560
[1, 2, 3, 4, [1, 2, 3]] 1553318834304

【2】深拷贝

import copy

# 【2】.深拷贝
# 深拷贝会将原来的列表完全复制一份,不会影响到原先的列表
# copy.deepcopy()
num_list = [1, 2, 3, 4,[1,2,3]]
num_list_new = copy.deepcopy(num_list)

num_list_new[4].append(5)
print(num_list_new,id(num_list_new))
print(num_list,id(num_list))

[1, 2, 3, 4, [1, 2, 3, 5]] 2110769688960
[1, 2, 3, 4, [1, 2, 3]] 2110769688704

【3】总结

  • 浅拷贝只会复制顶层对象,而不会影响到深层的可变数据类型

  • 在复制出来的列表,列表中的列表引用的是原来列表的引用

  • 深拷贝会递归的复制整个对象的数据结构

  • 在复制出来的列表,列表中的列表引用的是新列表的引用

![屏幕截图 2024-04-08 151236](C:\Users\jy255\Pictures\Screenshots\屏幕截图 2024-04-08 151236.png)

  • 上为浅拷贝
  • 下为深拷贝
posted @   随机昵称yi  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示