python自带list类型和numpy中ndarray类型 关于copy操作的三种类型

此处操作在python3环境

有三种类型  完全不复制视图(view或者叫浅复制(shadow copy)和深复制deep copy),以下分list类型和ndarray类型说明

1、list类型

list5 = list1[:] 这种形式也与上图中的切片操作相同,会产生新的list。

此处与“https://blog.csdn.net/u010099080/article/details/59111207”该链接说的有点不一致,但本文说法在python3下亲自验证过,可能该文实现环境不是python3,有待进一步验证。

该文中说:具体来说,list5 = list1[:] 会创建一个新的对象 b(所以 id(b) 和id(a) 返回的结果是不一样的,如果写list5 = list1,则两者的id是一致的),但是list5的数据完全来自于list1,和 list1保持完全一致,换句话说,list5的数据完全由list1保管,他们两个的数据变化是一致的

如果改变list2的值,都会导致list1的值发生改动,而改动list3和list4的值则不影响list1和与list1共享数据的变量。

2、ndarray类型

数组切片是原始数组的视图,这意味着数据不会被复制,视图上的任何修改都会被直接反映到源数组上. 
array1,array2,array3,array4实际指向同一个内存值,任意修改其中的一个变量,其他变量值都会被修改。 
若想要得到的是ndarray切片的一份副本而非视图,就需要显式的进行复制操作函数copy()。 
eg: 
array5=array1.copy() #对原始的array1的复制 
array6=array1[1:4].copy() #对切片array1[1:4]的复制 
那么,修改array5或array6,就不会影响array1。

 

总结:list切片产生新的list,ndarray切片不产生新的ndaarray,list和ndarray的.copy()方法均能深度拷贝。

 

a=[1,2,3,4,5]
b=a[:]
print(a,b,sep='\n')
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]


a[0]=2
print(a,b,sep='\n')
[2, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

 

import numpy as np
a1 = np.arange(1,10)

b1 = a1
b2 = a1[:]
b3 = a1[2:6]
b4 = a1[2:6].copy()
print(a1,b1,b2,b3,b4,sep='\n')
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[3 4 5 6]
[3 4 5 6]


b2[0]=4
print(a1,b1,b2,b3,b4,sep='\n')
[4 2 3 4 5 6 7 8 9]
[4 2 3 4 5 6 7 8 9]
[4 2 3 4 5 6 7 8 9]
[3 4 5 6]
[3 4 5 6]
 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值