深浅copy

本文详细介绍了Python中的深浅copy概念,通过实例展示了它们的区别。浅copy仅复制对象的第一层,而深copy则对整个对象进行完全复制,确保副本与原对象独立。在处理包含多层数据结构的列表时,深copy能确保修改副本不会影响原对象。在函数中需要返回原数据及其修改版本时,深copy是必要的选择。而对于单层数据结构,浅copy即可满足需求。
摘要由CSDN通过智能技术生成

深浅copy

        copy就是把一个东西复制过来。由于数据都是存储在内存中,数据之间的复制存在复制后两个变量指向同一个内存地址,如果改变其中一个,另外一个也会作出同样的改变。但是在实际的场景中,我们往往想要对两个相同的数据做不同的处理。

赋值

import copy
a = [1,1,2,3,5,[1,2,3]]
#输出a
	[1, 1, 2, 3, 5, [1, 2, 3]]
b = a 
#输出,b
	[1, 1, 2, 3, 5, [1, 2, 3]]

a.append(3)
#输出a,b
	([1, 1, 2, 3, 5, [1, 2, 3], 3], [1, 1, 2, 3, 5, [1, 2, 3], 3])

        由上代码可以看出,赋值操作之后,两个变量指向的是一块内存地址,如果其中一个变量作出修改,另一个变量会同样的作出改变。

浅copy

a = [1,1,2,3,5,[1,2,3]]
b = copy.copy(a)
#输出b
	[1, 1, 2, 3, 5, [1, 2, 3]]

a.append(3)
#输出a,b
	([1, 1, 2, 3, 5, [1, 2, 3], 3, 3], [1, 1, 2, 3, 5, [1, 2, 3]])
print(id(a))
print(id(b))
#输出
	2022706578304
	2022706553792
a[5][0]=100
#输出a,b
	([1, 1, 2, 3, 5, [100, 2, 3], 3, 3], [1, 1, 2, 3, 5, [100, 2, 3]])

        a经过浅copy得到b,通过查看内存地址,可以看出a和b的内存id不同,因此a和b是两个不同的变量。在列表的第一层,通过给a增加一个元素,修改a,列表b并没有变化。

        但是对于列表的第二层,列表中的列表。我们通过代码发现,修改其中一个,另一个变量中此列表也会作出变化。因此,浅copy仅仅copy了第一层。

深copy

a = [1,1,2,3,5,[1,2,3]]
b = copy.deepcopy(a)
#输出a,b
	([1, 1, 2, 3, 5, [1, 2, 3]], [1, 1, 2, 3, 5, [1, 2, 3]])
a.append(3)
#输出a,b
	([1, 1, 2, 3, 5, [1, 2, 3], 3], [1, 1, 2, 3, 5, [1, 2, 3]])
a[5][0]=100
#输出a,b
	([1, 1, 2, 3, 5, [100, 2, 3], 3], [1, 1, 2, 3, 5, [1, 2, 3]])
print(id(a))
print(id(b))
print(id(a[5]))
print(id(b[5]))
#输出
	2022707725888
	2022706500352
	2022703723200
	2022707270912

        由上代码可以看出,经过深copy后,两个变量独立互不影响。

        如果在一个函数中,我们不但需要返回原数据,还要返回对原数据进行一些操作后的数据,(列表为例)若此数据含有多层我们不能简单的使用赋值或者浅copy来复制数据,可以通过深copy来进行操作。

        若原数据只有一层,我们可以使用浅copy来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值