python原生拷贝与numpy包拷贝异同比较

python原生拷贝

无拷贝:直接赋值

>>> import copy
>>> a = [1, 2, 3]
>>> b = a
>>> id(a)
2207106563520
>>> id(b)
2207106563520
>>> id(a[0])
140714276431760
>>> id(b[0])
140714276431760

浅拷贝:数据存储地址不变,仅改变存储指向这块区域的地址的存放地址(即对象不变)

>>> b = copy.copy(a)
>>> id(a)
2207106563520
>>> id(b)
2207106666432
>>> id(a[0])
140714276431760
>>> id(b[0])
140714276431760

深拷贝:数据存储地址和存储指向这块区域的地址的存放地址都会改变(即对象变了)

方法为copy.deepcopy()。示例略。

numpy包的拷贝

直接赋值等同于浅拷贝(注意:不是使用copy包的copy方法)(对象没变,存储对象的位置也没变)

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> id(a)
2207106441936
>>> b = a
>>> id(b)
2207106441936
>>> id(a[0])
2207106338160
>>> id(b[0])
2207106338160

值得注意的是,当使用切片拷贝时:数据保存地址未发生改变,变得同样是存储地址的地址

>>> b = a[1:2]
>>> id(a)
2207106441936
>>> id(b)
2207106441840
>>> id(b[0])
2207106338096
>>> id(a[1])
2207106338096

深拷贝:numpy的copy方法执行深拷贝(对象没变,只是存储对象的位置变了)

>>> b = a.copy()
>>> id(a)
2207115500496
>>> id(b)
2207106442032
>>> id(a[0])
2207106338224
>>> id(b[0])
2207106338224

此时,数据存储地址没有发生改变,改变的只是存储地址的地址。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值