python-深拷贝和浅拷贝

本文详细解释了Python中列表的浅拷贝与深拷贝的区别,包括如何使用copy方法及deepcopy函数来避免引用共享导致的数据修改问题。

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

Python中的对象之间赋值时是按引用传递的,以列表为例:
这里写图片描述
列表中的元素通过下标索引与内存对象一一对应。

浅拷贝

当我们用”=”复制一列表时,并修改某一个值时会出现原列表值也被修改:

>>>l = ['A', 'B', 'C', 'D']
>>>l2 = l
>>>l2
['A', 'B', 'C', 'D']
>>>l2[1] = 'Z'
>>>l
['A', 'Z', 'C', 'D']         #修改的是l2的值,但是l中的值也被修改

这是因为,用l2 = l 时,只是传递了引用,l和l2之间是共享引用的,这种拷贝叫浅拷贝
这里写图片描述
当我们修改l2的值时,列表l因为和l2共享同一下标,所以也就发生了改变:
这里写图片描述

如果我们只是简单的想要复制一个一模一样的变量,并且避免发生共享引用,可以使用序列的copy方法或者l2 = l[:]

>>>l = ['A', 'B', 'C', 'D']
>>>l2 = l.copy()
>>>l2
['A', 'B', 'C', 'D']
>>>l2[1] = 'Z'
>>>l
['A', 'B', 'C', 'D']
>>>l2
['A', 'Z', 'C', 'D']
>>>l3 = l[:]
>>>l3[2] = 'Q'
>>>l3
['A', 'B', 'Q', 'D']
>>>l
['A', 'B', 'C', 'D']

深拷贝

这两种方法都能够完全复制一维列表的下标和内存对象,但是!再遇到多维列表时又会出现问题

>>>l = [[1, 2], 'A', 'B', 'C', 'D']
>>>l2 = l.copy()
>>>l2[0][1] = 0
>>>l
[[1, 0], 'A', 'B', 'C', 'D']

由此可见这两种方法只能完全复制一维列表,在复制二维列表时同样只是复制了引用,对于这种情况,可以使用copy模块下的deepcopy()方法

>>>import copy
>>>l = [[1, 2], 'A', 'B', 'C', 'D']
>>>l2 = copy.deepcopy(l)
>>>l2[0][1] = 0
>>>l2
[[1, 0], 'A', 'B', 'C', 'D']
>>>l
[[1, 2], 'A', 'B', 'C', 'D']         #l2的值改变时,l的值没有发生改变
#再来测试一下三维列表
>>>l = [[[1,2], 3, 4], 5, 6]
>>>l2 = copy.deepcopy(l)
>>>l2[0][0][1] = 0
>>>l2
[[[1, 0], 3, 4], 5, 6]
>>>l
[[[1, 2], 3, 4], 5, 6]         #同样l2的值改变时,l的值没有发生改变

小结

  • 以上是自己学python时的一些笔记,感觉写在本上不方便,正好利用闲暇时间腾到csdn上。
  • 自己的总结,如果有那些地方不合理或有有误,请指正。
  • 知识体系图:[Python3基础
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值