赋值、深拷贝、浅拷贝的区别

本文详细解析了Python中浅拷贝与深拷贝的区别,包括它们的实现方式及在不同数据类型下的表现。通过实例展示了拷贝机制如何影响可变与不可变数据类型的内存地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

赋值b=a只传递对象的引用,b指向对象a的内存地址空间,因此,原有列表a改变的同时,被赋值的b也会做相应的改变。
浅拷贝b1=copy.copy(a)a与b1的内存地址不同,但是子对象的内存地址相同,因此,原始数据改变并不会造成深拷贝里面任何子项的改变
深拷贝b2=copy.deepcopy(a)a与b2的内存地址空间不同,包含子对象的拷贝,所以原始对象的改变并不会造成深拷贝里面的任何子对象的改变

当深拷贝和浅拷贝针对的对象全部是不可变数据类型时,两者效果相同;
当深拷贝和浅拷贝针对的对象包含的时可变数据类型时,两者才出现上述区别。

可变数据类型不可变数据类型
list所有数据类型、波尔型、元组、str
浅拷贝的实现深拷贝的实现
li.copy( ) 或 li[:] 或 copy.copy( )li.deepcopy( )

可变数据类型镶嵌可变数据类型

>>> import copy
>>> a = [1,2]
>>> b = [3,4]
>>> c = [a,b]
>>> c
[[1, 2], [3, 4]]
>>> d = copy.copy(c)
>>> id(a)
139939016415712
>>> id(b)
139939016415640
>>> id(c)
139939016463352
>>> id(c[0])
139939016415712
>>> id(c[1])
139939016415640
>>> 
>>> id(d)
139939016488360
>>> id(d[0])
139939016415712
>>> id(d[1])
139939016415640
>>> e = copy.deepcopy(c)
>>> e
[[1, 2], [3, 4]]
>>> id(e)
139939016487928
>>> id(e[0])
139939016488216
>>> id(e[1])
139939016415928

在这里插入图片描述

不可变数据类型嵌可变数据类型

>>> a
[1, 2]
>>> b
[3, 4]
>>> c = (a,b)
>>> c
([1, 2], [3, 4])
>>> d = copy.copy(c)
>>> d
([1, 2], [3, 4])
>>> e = copy.deepcopy(c)
>>> e
([1, 2], [3, 4])
>>> id(a)
139939016415712
>>> id(b)
139939016415640
>>> id(c)
139939016309792
>>> id(c[0])
139939016415712
>>> id(c[1])
139939016415640
>>> id(d)
139939016309792
>>> id(d[0])
139939016415712
>>> id(d[1])
139939016415640
>>> id(e)
139939016311152
>>> id(e[0])
25703992
>>> id(e[1])
25704064

在这里插入图片描述

不可变数据类型嵌不可变数据类型

>>> import copy
>>> a = (1,2)
>>> b = (3,4)
>>> c = (a,b)
>>> d = copy.copy(c)
>>> e = copy.deepcopy(c)
>>> c
((1, 2), (3, 4))
>>> d
((1, 2), (3, 4))
>>> e
((1, 2), (3, 4))
>>> id(a)
139704123841496
>>> id(b)
139704123841568
>>> id(c)
139704123839264
>>> id(c[0])
139704123841496
>>> id(c[1])
139704123841568
>>> id(d)
139704123839264
>>> id(d[0])
139704123841496
>>> id(d[1])
139704123841568
>>> id(e)
139704123839264
>>> id(e[0])
139704123841496
>>> id(e[1])
139704123841568

在这里插入图片描述

在这里插入图片描述
可变数据类型嵌不可变数据类型

>>> a
(1, 2)
>>> b
(3, 4)
>>> c = [a,b]
>>> d = copy.copy(c)
>>> e = copy.deepcopy(c)
>>> c
[(1, 2), (3, 4)]
>>> d
[(1, 2), (3, 4)]
>>> e
[(1, 2), (3, 4)]
>>> id(a)
139704123841496
>>> id(b)
139704123841568
>>> id(c)
19402336
>>> id(c[0])
139704123841496
>>> id(c[1])
139704123841568
>>> id(d)
19402624
>>> id(d[0])
139704123841496
>>> id(d[1])
139704123841568
>>> id(e)
19322208
>>> id(e[0])
139704123841496
>>> id(e[1])
139704123841568

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值