Perl的浅拷贝和深度拷贝
首先是深、淺拷貝的概念:
- 淺拷貝:shallow copy,只拷貝第一層的數(shù)據(jù)。Perl中賦值操作就是淺拷貝
- 深拷貝:deep copy,遞歸拷貝所有層次的數(shù)據(jù),Perl中Clone模塊的clone方法,以及Storable的dclone()函數(shù)是深拷貝
所謂第一層次,指的是出現(xiàn)嵌套的復(fù)雜數(shù)據(jù)結(jié)構(gòu)時(shí),那些引用指向的數(shù)據(jù)對(duì)象屬于深一層次的數(shù)據(jù)。例如:
@Person1=('wugui','tuner'); @Person2=('longshuai','xiaofang',['wugui','tuner']); @Person3=('longshuai','xiaofang',\@Person1);@Person1只有一層深度,@Person2和@Person3都有兩層深度。
淺拷貝
當(dāng)進(jìn)行賦值時(shí),拷貝給目標(biāo)的只是第一層數(shù)據(jù)對(duì)象。
@Person1_shallow=@Person1; @Person2_shallow=@Person2; @Person3_shallow=@Person3;拷貝給@Person1_shallow的是整個(gè)@Person1數(shù)據(jù),它們?cè)诮Y(jié)果上完全等價(jià),拷貝給@Person{2,3}_shallow的是@Person{2,3}的第一層數(shù)據(jù),也就是兩個(gè)元素和一個(gè)引用,拷貝引用時(shí)不會(huì)對(duì)引用進(jìn)行遞歸拷貝給賦值對(duì)象。簡(jiǎn)單地說,淺拷貝的過程就是源數(shù)據(jù)是怎樣的,拷貝后就是怎樣的。
如下圖:
因?yàn)闇\拷貝時(shí)引用不會(huì)進(jìn)行遞歸,所以拷貝前后的兩個(gè)對(duì)象都指向同一個(gè)引用。所以修改它們共同引用的數(shù)據(jù),同時(shí)也會(huì)修改另一份數(shù)據(jù)。例如:
@Person=('longshuai','xiaofang',['wugui','tuner']); @Person_shallow=@Person;$Person_shallow[2][1]="fairy";say "$Person_shallow[2][1]"; # 輸出:fairy say "$Person[2][1]"; # 輸出:fairy上述例子中只是給@Person_shallow進(jìn)行了元素修改操作,但同時(shí)卻把原始數(shù)據(jù)@Person也改了。因?yàn)?#64;Person_shallow和@Person引用的數(shù)據(jù)對(duì)象是相同的。
深拷貝:Clone和Storable
為了在拷貝階段保護(hù)引用的數(shù)據(jù)對(duì)象,Perl提供了深拷貝的方式。它會(huì)對(duì)引用進(jìn)行遞歸,拷貝引用所指向的數(shù)據(jù)對(duì)象。如圖:
也就是說,深拷貝的方式使得拷貝前后出現(xiàn)了兩個(gè)完全獨(dú)立的、互不影響的數(shù)據(jù)對(duì)象,修改其中任何一個(gè)對(duì)象都不會(huì)影響另一個(gè)。
Perl提供了一個(gè)Clone包(現(xiàn)在包的概念就是模塊),它的clone()可以遞歸拷貝,也就是深拷貝。Storable模塊也提供了dclone()函數(shù)進(jìn)行深拷貝。在拷貝層次低于或等于3層時(shí),Clone()的拷貝速度更快,在層次大于或等于4層時(shí),dclone()速度更快。
需要注意,clone()和dclone()的參數(shù)都必須是引用變量,當(dāng)然,也可以是\構(gòu)建的引用。
例如,使用Clone的clone()方法進(jìn)行深拷貝:
shell> cpan -i Clone use 5.010; use Clone qw(clone);@Person=('longshuai','xiaofang',['wugui','tuner']); $Person_deep=clone(\@Person);$Person[2][1]="fairy";say "$Person[2][1]"; # 輸出:fairy say "$Person_deep->[2][1]"; # 輸出:tuner同樣,使用Storable模塊的dclone()。
use 5.010; use Storable qw(dclone);@Person=('longshuai','xiaofang',['wugui','tuner']); $Person_deep=dclone(\@Person);$Person[2][1]="fairy";say "$Person[2][1]"; # 輸出:fairy say "$Person_deep->[2][1]"; # 輸出:tuner關(guān)于Storable模塊,他是用來實(shí)現(xiàn)數(shù)據(jù)持久化的主要工具,后面會(huì)有專門的文章詳細(xì)介紹。
總結(jié)
以上是生活随笔為你收集整理的Perl的浅拷贝和深度拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零基础入门深度学习(5) - 循环神经网
- 下一篇: postman里测试文件上传(Multi