深浅copy

浅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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅水鲤鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值