关于python中的浅copy和深copy(dict.copy,numpy.copy)

前言

python的数据储存方式完全由指针完成,这样的数据记录很容易引发一些数据误操作。

具体看下面的例子:

a = 1
b = 1
print(id(a))
print(id(b))

结果:

11062208
11062208

可以看出,两个变量的内存地址都是相同的。

1.浅copy和深copy

看下面的例子:

a = [1, 2, 3]
b = a
print(a)
print(b)
print(id(a))
print(id(b))
b[2] = 2
b[1] = 3
print(b)
print(a)

输出:

[1, 2, 3]
[1, 2, 3]
139691349775048
139691349775048
[1, 3, 2]
[1, 3, 2]

可以看出a的值随着b的值也随之发生了改变,这是因为a和b虽然是不同的变量名称,但是他们所指向的内存地址是相同的,如果修改内存地址的值,而不修改变量指向的内存地址,此时两个变量的值都会随之改变,因为此时a和b虽然看起来不一样,但其实就像同一个人穿了不同的衣服,本质是没变的,如果想b改变不影响a本身,此时就需要用到copy函数了,但是python的copy函数又分为浅copy和深copy。

深复制(deep copy),即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。 
而浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。

下面可以看一个例子:

import copy
a = [1, 2, 3, [4, 5]]
b = copy.copy(a)
c = copy.deepcopy(a)
print(a)
print(b)
print(c)
print('a:', id(a), 'b:', id(b), 'c:', id(c))
print('a:', id(a[3]), 'b:', id(b[3]), 'c:', id(c[3]))
c[3][0] = 'c'
b[3][0] = 'g'
a[3][1] = 'd'
print(a)
print(b)
print(c)

输出:

[1, 2, 3, [4, 5]]
[1, 2, 3, [4, 5]]
[1, 2, 3, [4, 5]]
a: 139691328652296 b: 139691349864968 c: 139691235775240
a: 139691235895944 b: 139691235895944 c: 139691349387784
[1, 2, 3, ['g', 'd']]
[1, 2, 3, ['g', 'd']]
[1, 2, 3, ['c', 5]]

可以看出,在copy和deepcopy之后,b和c的地址和a都不一样,但是浅copy的b的第四个元素的地址和a的第四个元素地址是相同的,这时候无论更改a[4]还是b[4],其值都会同步改变,如上结果所示,但是因为c是deep copy其父级和子级的地址都发生了改变,此时其不受a和b的影响,也不会影响a和b,这就是浅copy和深copy的差异之处。

2.关于dict和numpy

平常一般还会设计dict.copy()和numpy.copy()。两个数据格式的copy是不一样的,十分需要注意。dict的copy是浅copy,而numpy的copy则是深copy。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值