摘要:對(duì)于而言,情況可能會(huì)有點(diǎn)小復(fù)雜,因?yàn)橐磺薪詾閷?duì)象,所以的普通賦值深拷貝和淺拷貝之間都是有細(xì)微區(qū)別的。二下的他們?cè)谥校瑢?duì)象的賦值和傳遞都是引用。
一、深拷貝與淺拷貝
??深拷貝:賦值時(shí)值完全復(fù)制,完全的copy,對(duì)其中一個(gè)作出改變,不會(huì)影響另一個(gè)
??淺拷貝:賦值時(shí),引用賦值,相當(dāng)于取了一個(gè)別名。對(duì)其中一個(gè)修改,會(huì)影響另一個(gè)
??對(duì)于PHP而言,= 賦值時(shí),普通對(duì)象是深拷貝,但對(duì)對(duì)象來說,是淺拷貝,即引用賦值。當(dāng)對(duì)象作為參數(shù)傳遞時(shí),無論參數(shù)前是否有&引用符號(hào),都將被看做是賦值引用。
??對(duì)于python而言,情況可能會(huì)有點(diǎn)小復(fù)雜,因?yàn)閜ython一切皆為對(duì)象,所以python的普通賦值、深拷貝和淺拷貝之間都是有細(xì)微區(qū)別的。
二、php下的他們??在php5中,對(duì)象的 = 賦值和傳遞都是引用。要想實(shí)現(xiàn)拷貝副本,php提供了clone函數(shù)實(shí)現(xiàn)。clone完全copy了一份副本。但是clone時(shí),我們可能不希望copy源對(duì)象的所有內(nèi)容,那我們可以利用__clone來操作。
請(qǐng)看如下代碼段:
a = 2;//修改m,n也隨之改變 echo $n->a;//輸出2,淺拷貝 echo PHP_EOL; ?>
??由于對(duì)象的賦值時(shí)引用,要想實(shí)現(xiàn)值復(fù)制,php提供了clone函數(shù)來實(shí)現(xiàn)復(fù)制對(duì)象。但是clone函數(shù)存在這么一個(gè)問題,克隆對(duì)象時(shí),原對(duì)象的普通屬性能值復(fù)制,但是源對(duì)象的對(duì)象屬性賦值時(shí)還是引用賦值,淺拷貝。
obj = new Test(); } } $m = new TestOne(); $n = $m;//這是完全的淺拷貝,無論普通屬性還是對(duì)象屬性 $p = clone $m; //普通屬性實(shí)現(xiàn)了深拷貝,改變普通屬性b,不會(huì)對(duì)源對(duì)象有影響 $p->b = 2; echo $m->b;//輸出原來的1 echo PHP_EOL; //對(duì)象屬性是淺拷貝,改變對(duì)象屬性中的a,源對(duì)象m中的對(duì)象屬性中a也改變 $p->obj->a = 3; echo $m->obj->a;//輸出3,隨新對(duì)象改變 ?>
??要想實(shí)現(xiàn)對(duì)象真正的深拷貝,有以下兩種方法:
1、利用序列化反序列化實(shí)現(xiàn)
obj = new Test(); } } $m = new TestOne(); //方法二,序列化反序列化實(shí)現(xiàn)對(duì)象深拷貝 $n = serialize($m); $n = unserialize($n); $n->b = 2; echo $m->b;//輸出原來的1 echo PHP_EOL; //可以看到,普通屬性實(shí)現(xiàn)了深拷貝,改變普通屬性b,不會(huì)對(duì)源對(duì)象有影響 $n->obj->a = 3; echo $m->obj->a;//輸出1,不隨新對(duì)象改變,還是保持了原來的屬性,可以看到,序列化和反序列化可以實(shí)現(xiàn)對(duì)象的深拷貝 ?>
2、寫clone函數(shù)
obj = new Test(); } //方法一:重寫clone函數(shù) public function __clone(){ $this->obj = clone $this->obj; } } $m = new TestOne(); $n = clone $m; $n->b = 2; echo $m->b;//輸出原來的1 echo PHP_EOL; //可以看到,普通屬性實(shí)現(xiàn)了深拷貝,改變普通屬性b,不會(huì)對(duì)源對(duì)象有影響 //由于改寫了clone函數(shù),現(xiàn)在對(duì)象屬性也實(shí)現(xiàn)了真正的深拷貝,對(duì)新對(duì)象的改變,不會(huì)影響源對(duì)象 $n->obj->a = 3; echo $m->obj->a;//輸出1,不隨新對(duì)象改變,還是保持了原來的屬性 ?>三、python下的他們
??“對(duì)一個(gè)對(duì)象進(jìn)行淺拷貝其實(shí)是新創(chuàng)建了一個(gè)類型和原來對(duì)象一樣,但是內(nèi)容是原來對(duì)象元素的引用。換句話說,這個(gè)拷貝的對(duì)象本身是新的,但是它的內(nèi)容不是”,摘自《Python核心編程》。
??這是我個(gè)人對(duì)python下淺拷貝和深拷貝的理解:
賦值:簡(jiǎn)單地拷貝對(duì)象的引用,兩個(gè)對(duì)象的id相同。
淺拷貝:創(chuàng)建一個(gè)新的組合對(duì)象,這個(gè)新對(duì)象與原對(duì)象共享內(nèi)存中的子對(duì)象。
深拷貝:創(chuàng)建一個(gè)新的組合對(duì)象,同時(shí)遞歸地拷貝所有子對(duì)象,新的組合對(duì)象與原對(duì)象沒有任何關(guān)聯(lián)。雖然實(shí)際上會(huì)共享不可變的子對(duì)象,但不影響它們的相互獨(dú)立性。
??淺拷貝和深拷貝的不同僅僅是對(duì)組合對(duì)象來說,所謂的組合對(duì)象就是包含了其它對(duì)象的可變對(duì)象,如列表,類實(shí)例。而對(duì)于數(shù)字、字符串以及其它“原子”類型,沒有拷貝一說,產(chǎn)生的都是原對(duì)象的引用。
下面的代碼希望能對(duì)你有進(jìn)一步的幫助;
#! /usr/bin/python # -*- coding:UTF-8 -*- import copy # 淺拷貝 a = [1, "a", 3, [4, 5, 6], [[7, 8, 9]]] b = a c = list(a) d = copy.deepcopy(a) print "原地址&&&" print id(a) print "賦值地址&&&" print id(b) print "淺拷貝地址&&&" print id(c) print "深拷貝地址&&&" print id(d) print "賦值地址###" for i, j in zip(a, b): print id(i), id(j) print "淺拷貝地址###" for i, j in zip(a, c): print id(i), id(j) print "深拷貝地址###" for i, j in zip(a, d): print id(i), id(j) print "######" a[0] = 2 a[3][0] = 14 print "原值變化為 %d, %d" % (a[0], a[3][0]) print "*******" print "賦值變化" print b[0], b[3][0] print "淺拷貝變化" print c[0], c[3][0] print "深拷貝變化" print d[0], d[3][0] print "**##$$" print a
輸出如下:
參考博文http://www.cnblogs.com/taijun...
http://blog.csdn.net/u0115085...
http://www.cnblogs.com/zxlove...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40960.html
摘要:對(duì)于而言,情況可能會(huì)有點(diǎn)小復(fù)雜,因?yàn)橐磺薪詾閷?duì)象,所以的普通賦值深拷貝和淺拷貝之間都是有細(xì)微區(qū)別的。二下的他們?cè)谥?,?duì)象的賦值和傳遞都是引用。 一、深拷貝與淺拷貝 ??深拷貝:賦值時(shí)值完全復(fù)制,完全的copy,對(duì)其中一個(gè)作出改變,不會(huì)影響另一個(gè) ??淺拷貝:賦值時(shí),引用賦值,相當(dāng)于取了一個(gè)別名。對(duì)其中一個(gè)修改,會(huì)影響另一個(gè) ??對(duì)于PHP而言,= 賦值時(shí),普通對(duì)象是深拷貝,但對(duì)對(duì)象來說...
摘要:參考鏈接淺拷貝最簡(jiǎn)單的淺拷貝就賦值。所謂的淺拷貝就是,后面的對(duì)象和前面的對(duì)象在第一層數(shù)據(jù)結(jié)構(gòu)中指向同一個(gè)堆地址。但是如果前面的數(shù)據(jù)不止有一層,如此時(shí),使用和方式實(shí)現(xiàn)的都是淺拷貝。深拷貝管你怎么變,互不影響。 參考鏈接:http://www.cnblogs.com/st-les...https://blog.csdn.net/hj7jay/... 淺拷貝: 1.最簡(jiǎn)單的淺拷貝就賦值。由于...
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業(yè)務(wù)需要急需知道如何深拷貝對(duì)象的開發(fā)者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實(shí)現(xiàn)思路以及小伙伴們?nèi)绻褂昧诉@種黑科技一定要清楚這樣寫的優(yōu)缺點(diǎn)。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業(yè)務(wù)需要,急需知道如何深拷貝JS對(duì)象的開發(fā)者。 第二類,希望扎實(shí)JS基礎(chǔ),將來好去面試官前秀操作...
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業(yè)務(wù)需要急需知道如何深拷貝對(duì)象的開發(fā)者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實(shí)現(xiàn)思路以及小伙伴們?nèi)绻褂昧诉@種黑科技一定要清楚這樣寫的優(yōu)缺點(diǎn)。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業(yè)務(wù)需要,急需知道如何深拷貝JS對(duì)象的開發(fā)者。 第二類,希望扎實(shí)JS基礎(chǔ),將來好去面試官前秀操作...
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業(yè)務(wù)需要急需知道如何深拷貝對(duì)象的開發(fā)者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實(shí)現(xiàn)思路以及小伙伴們?nèi)绻褂昧诉@種黑科技一定要清楚這樣寫的優(yōu)缺點(diǎn)。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業(yè)務(wù)需要,急需知道如何深拷貝JS對(duì)象的開發(fā)者。 第二類,希望扎實(shí)JS基礎(chǔ),將來好去面試官前秀操作...
閱讀 3619·2023-04-25 19:56
閱讀 1698·2021-11-12 10:36
閱讀 1822·2021-11-08 13:19
閱讀 1562·2019-08-30 14:06
閱讀 3056·2019-08-30 11:01
閱讀 1765·2019-08-29 13:23
閱讀 2763·2019-08-29 11:18
閱讀 3457·2019-08-26 13:35