浅copy
浅copy是内存的指向不同,元素id还是沿用copy之前的,可变不可变都是一样
1、浅copy列表是两个列表,id不相同
s1=[1,2,3,[11,22,33]]
s2=s1.copy()
s1.append(44)
print(s1,id(s1))#[1, 2, 3, [11, 22, 33], 44] 2090904676608
print(s2,id(s2))#[1, 2, 3, [11, 22, 33]] 2090907589440
2、浅copy元素相同,id相同
s1=[1,2,3,[11,22,33]]
s2=s1.copy()
s1[-1].append(44)
print(s1,id(s1[-1]))#[1, 2, 3, [11, 22, 33, 44]] 2523862516992
print(s2,id(s2[-1]))#[1, 2, 3, [11, 22, 33, 44]] 2523862516992
#开辟了一块新内存空间(槽位),对s1的copy是新的槽位,但是内容还是沿用之前的地址,所以列表id不同,元素id相同,槽位里是内存号,指向还是同一个列表
3、改变的只是内存的指向
s1=[1,2,3,[11,22,33]]
s2=s1.copy()
s1[1]=12
print(s1,id(s1[1]))
#[1, 12, 3, [11, 22, 33]] 1960098163344
print(s2,id(s2[1]))
#[1, 2, 3, [11, 22, 33]] 1960098163024
4、另一种写法
import copy
s1=[1,2,3,[11,22,33]]
s2=copy.copy(s1)#浅copy
print(s1,id(s1))#[1, 2, 3, [11, 22, 33]] 2537390491456
print(s2,id(s2))#[1, 2, 3, [11, 22, 33]] 2537393081856
print(s1 is s2)#False
print(id(s1[-1]))#2537393078336
print(id(s2[-1]))#2537393078336
深copy
深copy是两个表,元素id不同,但是python做了个优化,python将不可变的数据类型沿用同一个,指向的还是原来copy之前的,可变的重新创建,包括元组
1、copy列表是两个列表,id不相同,元素的id也不相同
import copy
s1=[1,2,3,[11,22,33]]
s2=copy.deepcopy(s1)#深copy
# s1[-1].append(666)
print(s1,id(s1))#[1, 2, 3, [11, 22, 33]] 3071881397824
print(s2,id(s2))#[1, 2, 3, [11, 22, 33]] 3071883988544
print(id(s1[-1]))#2435381575744
print(id(s2[-1]))#2435381576832
2、元素的id不一样,不共用
import copy
s1=[1,2,3,[11,22,33]]
s2=copy.deepcopy(s1)#深copy
s1[-1].append(666)
print(s1,id(s1[-1]))
#[1, 2, 3, [11, 22, 33, 666]] 2755944955968
print(s2,id(s2[-1]))
#[1, 2, 3, [11, 22, 33]] 2755944956992
3、优化:python对深copy做了个优化,将不可变的数据类型沿用同一个,指向的还是原来copy之前的,可变的重新创建,包括元组
不可变:str、bool、int、tuple
可变:list、dict、set
import copy
s1=[1,2,3,[11,22,33]]
s2=copy.deepcopy(s1)
print(s1,id(s1[1]))#[1, 2, 3, [11, 22, 33]] 1924667763024
print(s2,id(s2[1]))#[1, 2, 3, [11, 22, 33]] 1924667763024
print(id(s1[-1]))#1924675977024
print(id(s2[-1]))#1924675978176