python基础篇学习(十二)之深浅拷贝

本文详细介绍了Python中的浅拷贝和深拷贝概念,指出浅拷贝只复制容器本身和不可变类型,对可变类型仅复制引用;而深拷贝则会创建全新的独立副本,包括所有可变类型。通过实例展示了两者在操作列表时的不同效果。

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

python基础篇学习(十二)之深浅拷贝

一、浅拷贝

浅拷贝:它会把原列表第一层存的索引和内存地址完全拷贝一份给新列表,如果原列表存的全都是不可变类型,浅拷贝可以正常使用,新列表改动之后全都是产生新的值,根本不会影响到原列表,但原列表一旦包含了可变类型,浅拷贝的新列表就没办法和原列表完全分开了。

l1 = ['小圆子', '徐凤年', ['李淳罡', '邓太阿']]
l3 = l1.copy()
print(l3)
print(id(l1), id(l3))
print(id(l1[0]), id(l1[1]), id(l1[2]))
print(id(l3[0]), id(l3[1]), id(l3[2]))
----------------------------------------------------------------
# 运行结果:
['小圆子', '徐凤年', ['李淳罡', '邓太阿']]
2063287651904 2063287651968
2063287480208 2063287479728 2063287334656
2063287480208 2063287479728 2063287334656

说明:
1.这两个列表(l1和l3)的id不一样,说明这两个列表对应的是两块不同的内存地址;
2.这两个列表(l1和l3)的id不一样,但是他们里面存的数据的id却是一样的,说明我们拷贝的这个列表,只是拷贝了这个容器本身,产生一个新的容器,但是容器里面的数据还是原来的数据;

l1 = ['小圆子', '徐凤年', ['李淳罡', '邓太阿']]
l3 = l1.copy()
l3[0] = '高坦克'
l3[1] = '徐晓'
l3[2][0] = '剑九黄'
l3[2][1] = '王仙芝'
print(l1)
print(l3)
----------------------------------------------------------------
# 运行结果:
['小圆子', '徐凤年', ['剑九黄', '王仙芝']]
['高坦克', '徐晓', ['剑九黄', '王仙芝']]

说明:
1.发现l3所有的内容都被我们改掉了,但是l1只有它的子列表变了;
2.这是因为浅拷贝只会把原列表的第一层里面的索引和内存地址一摸一样拷贝到一个新的内存空间里面,由于这个列表里的第1和第2个元素是字符串(不可变类型),所以当改l3的时候,又会申请新的内存空间;
3.由于这个列表里的第3个元素是列表(可变类型),当改子列表的时候,他的内存地址是不会变的,所以l1和l3里面存的还是原来的子列表的内存地址,但是这个子列表里的数据却被我们改掉了,所以会出现只有子列表的数据被改了;

二、深拷贝

深拷贝:针对可变的容器类型会产生新的容器,针对不可变类型则任然会使用原值,因为这样更加省内存空间,两者的数据是完全独立的,没有任何交集,所以如果想要拷贝一个列表,并且想让拷贝的列表和原列表完全独立开,就一定要使用深拷贝。

import copy
l1 = ['小圆子', '徐凤年', ['李淳罡', '邓太阿']]
l3 = copy.deepcopy(l1)
print(id(l1))
print(id(l3))
print(id(l1[0]), id(l1[1]), id(l1[2]))
print(id(l3[0]), id(l3[1]), id(l3[2]))
print(id(l1[2][0]), id(l1[2][1]))
print(id(l3[2][0]), id(l3[2][1]))
----------------------------------------------------------------
# 运行结果:
1797080546944
1797081155328
1797076053904 1797076053424 1797075908352
1797076053904 1797076053424 1797080590272
1797080580144 1797080580240
1797080580144 1797080580240
import copy
l1 = ['小圆子', '徐凤年', ['李淳罡', '邓太阿']]
l3 = copy.deepcopy(l1)
l3[0] = '高坦克'
l3[1] = '徐晓'
l3[2][0] = '剑九黄'
l3[2][1] = '王仙芝'
print(l1)
print(l3)
----------------------------------------------------------------
# 运行结果:
['小圆子', '徐凤年', ['李淳罡', '邓太阿']]
['高坦克', '徐晓', ['剑九黄', '王仙芝']]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值