0
点赞
收藏
分享

微信扫一扫

深浅copy

纽二 2022-02-16 阅读 117

目录

深浅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来实现。

举报

相关推荐

0 条评论