无名商城论坛

搜索
查看: 278|回复: 0

[其他技术] 【HC】Python深浅copy

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 18:33:44 | 显示全部楼层 |阅读模式

深浅copy
数据类型的分类

可变(不可哈希)的:list dict set
不可变(可哈希)的:str bool int tuple
浅copy:
会在内存中新开辟一个空间,存放这个copy的列表,但是列表里的内容还是沿用之前对象的内存地址。所以尽管l1,l2的id不同,但是内容id是相同的。

#浅拷贝
l1 = [1,2,3,[4,5,6]]
l2 = l1.copy()
print(id(l1))
print(id(l2))
l1.append(88)
print(l1)
print(l2)
print("-----给列表里的小列表添加值------")
print(id(l1[3]))
print(id(l2[3]))
l2[-1].append("哈哈哈")
print(l1)
print(l2)

1979862092936
1979865206344
[1, 2, 3, [4, 5, 6], 88]
[1, 2, 3, [4, 5, 6]]
-----给列表里的小列表添加值------
1979865206472
1979865206472
[1, 2, 3, [4, 5, 6, '哈哈哈'], 88]
[1, 2, 3, [4, 5, 6, '哈哈哈']]


#切片也是浅copy
l1 = [1,2,3,[4,5,6]]
l2 = l1[:]
l1[-1].append("哈哈")
print(l1)
print(l2)

[1, 2, 3, [4, 5, 6, '哈哈']]
[1, 2, 3, [4, 5, 6, '哈哈']]
1
2
深copy:
会在内存中开辟新空间,将原列表以及列表里面的可变数据类型重新创建一份,不可变的数据类型则沿用之前的

#深copy
import copy
l1 = [1,2,3,[4,5,6]]
l2 = copy.deepcopy(l1)
print(id(l1))
print(id(l2))
print(id(l1[0]),id(l2[0]))    # 不可变的数据类型则沿用之前的,所以id相同
print(id(l1[-1]),id(l2[-1])) #  可变的数据类型在内存中重新创建一份,所以id不同
l1[-1].append("哈哈哈")
print(l1)
print(l2)

1490814040776
1490814773896
140707873329984 140707873329984
1490813655816 1490814040584
[1, 2, 3, [4, 5, 6, '哈哈哈']]
[1, 2, 3, [4, 5, 6]]


区别:

浅copy:list dict:嵌套的可变的数据类型是同一个。

深copy:list dict:嵌套的可变的数据类型不是同一个。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表