NumPy之浅拷贝和深拷贝

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NumPy之浅拷贝和深拷贝相关的知识,希望对你有一定的参考价值。

参考技术A 一次性搞定NumPy入门基础知识
NumPy之操控ndarray的形状
NumPy之浅拷贝和深拷贝
NumPy之索引技巧

NumPy经常会操作size很大的数据结构,如果不加小心,会产生很大的内存和性能浪费,因此要理解操作中的各种行为,根据实际情况选择最合理的方法。

如果只是进行简单的赋值操作,是不会发生拷贝行为的。

这是由Python语言层面保证的,在进行赋值操作时,Python进行的时引用传递,两个变量指向同一块内存区域。

不同的ndarray对象可以共享相同的数据区。 view 方法可以新建一个新的ndarray,这个新的ndarray和原始的ndarray不是一个对象(意味着除了数据区,其他一些属性,例如形状,都可以是不同的):

注意,索引操作返回的就是原始ndarray的一个view:

copy 方法可以生成一个完整的新ndarray对象,这个ndarray对象和原始的ndarray没有任何关系:

一个典型的应用场景是:如果使用索引操作后,原始的ndarray已经不需要了,那么就可以首先进行一个深拷贝,然后销毁原始ndarray,这样会减少内存消耗。

lua踩坑系列之浅拷贝与深拷贝


每日一荤

剪发去了,洗头小妹,给我系上围布,看到我的表情,唬了她一跳,大,大哥,你眼睛好大哦!我说妹子,不是哥眼睛大,你再勒紧点,我还能把舌头吐出来!


lua踩坑系列之浅拷贝与深拷贝
前言
lua踩坑系列之浅拷贝与深拷贝


先来说说·,为什么突然谈及到浅拷贝和深拷贝这个问题。因为时间紧任务重,lua零基础参与项目研发,没有系统学过lua,对于lua里面的坑,差不多该踩的,能踩的,我踩了,或者即将去踩了。这不,本来周五准时下班,然后愉快的度过一个双休。梦想总是美好的,现实就是,它来了(坑),由于系统模块比较大,牵扯到的数据比较多,开发的时候也没太注重数据的统一,数据出现了,只能大海捞针去找问题。


lua踩坑系列之浅拷贝与深拷贝
浅分类
对于拷贝这个问题,lua和其他很多语言一样,分为浅拷贝和深拷贝。


lua踩坑系列之浅拷贝与深拷贝
浅拷贝
lua踩坑系列之浅拷贝与深拷贝


在lua中,使用“=”进行浅拷贝,根据拷贝对象的不同,又分为两种情况:


1

拷贝对象为string、number、boolean等基础类型时,拷贝的过程是进行复制粘贴。创建一个新的对象,拷贝出来的新对象和原来的对象互不影响,互不干涉,所以修改拷贝出来的对象的值不会影响到原来的对象的值!

local value_A=10local value_B=value_Aprint("A的值:"..value_A)print("B的值:"..value_B)value_B=5print("A的值:"..value_A)print("B的值:"..value_B)
输出结果:
A的值:10B的值:10A的值:10B的值:5

2

拷贝对象的类型为table,拷贝出来的对象和拷贝前的实际上是同一个对象,占同一个内存,简单点说就是一个人的两个名字。如果改变了拷贝出来对象的值,原对象也会随之改变。

local tab={}tab["csdn"]="懒人下蛋"tab["抖音"]="shirln"tab["微信公众号"]="懒人下蛋"tab["QQ群"]="704621321"
for k,v in pairs(tab) do print(k.."对应的账号:"..v)end
local temp=tabtemp["csdn"]="爱上游戏开发"temp["微信公众号"]="爱上游戏开发"
for k,v in pairs(tab) do print("拷贝前的对象:"..k.."对应的账号:"..v)endfor k,v in pairs(temp) do print("拷贝后的对象:"..k.."对应的账号:"..v)end
输出结果:
csdn对应的账号:懒人下蛋QQ群对应的账号:704621321微信公众号对应的账号:懒人下蛋抖音对应的账号:shirln
拷贝前的对象:csdn对应的账号:爱上游戏开发拷贝前的对象:QQ群对应的账号:704621321拷贝前的对象:微信公众号对应的账号:爱上游戏开发拷贝前的对象:抖音对应的账号:shirln
拷贝后的对象:csdn对应的账号:爱上游戏开发拷贝后的对象:QQ群对应的账号:704621321拷贝后的对象:微信公众号对应的账号:爱上游戏开发拷贝后的对象:抖音对应的账号:shirln
注意:对于2,如果想修改拷贝后的对象的值,使原对象不受影响,那么就要采用深拷贝了。
lua踩坑系列之浅拷贝与深拷贝
深拷贝
lua踩坑系列之浅拷贝与深拷贝


Lua中没有提供这样的api的,那就自己封装一个函数,递归拷贝table中所有元素以及设置元表即可!如下
function clone(master) local temp = {} for k, v in pairs(master) do if type(v) == "table" then temp[k] = clone(v) else temp[k] = v end end return tempend
使用方法:
local tab={}tab["csdn"]="爱上游戏开发"tab["抖音"]="shirln"tab["微信公众号"]="爱上游戏开发"tab["QQ群"]="704621321"
local temp=clone(tab)prring(temp)

输出结果:

704621321shirln爱上游戏开发爱上游戏开


不要去等明天,不要去相信永远,你所能做的,就是眼前。你所爱,为尔所为。没有人会等你,在这风雨飘摇的人生路上。你所能做的,就是让自己更快、更强。

                                                                       -————每日鸡汤

玩转游戏开发

长按识别

关注懒人下蛋

以上是关于NumPy之浅拷贝和深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

python之浅拷贝和深拷贝

pyhton之浅拷贝(copy)和深拷贝(deepcopy)详解,举例说明

java克隆之浅拷贝和深拷贝

lua踩坑之浅拷贝与深拷贝

python之浅拷贝深拷贝

lua踩坑系列之浅拷贝与深拷贝