|
深浅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:嵌套的可变的数据类型不是同一个。
|
|