問(wèn)題1 :為什么只設(shè)置了joe的值,但是jane的值也跟著變化呢?
原因:因?yàn)槲覀冎蛔隽艘粋€(gè)淺拷貝,對(duì)一個(gè)對(duì)象進(jìn)行淺拷貝其實(shí)是新創(chuàng)建了一個(gè)類(lèi)型跟原對(duì)象一樣,其內(nèi)容是原來(lái)對(duì)象元素的 | 引用 | 直白的說(shuō)就是,新建了一個(gè)對(duì)象,但是它的內(nèi)容 | 引用 | 原來(lái)的對(duì)象。
因?yàn)閷?duì)象jane的內(nèi)容引用自joe的內(nèi)容,所以當(dāng)joe的內(nèi)容更改時(shí),jane也隨之更改。
序列類(lèi)型對(duì)象的淺拷貝是默認(rèn)類(lèi)型拷貝,可以用以下幾種方式實(shí)施
完全切片操作利用工廠函數(shù),比如list(), dict()等使用copy模塊的copy函數(shù)問(wèn)題2: 為什么對(duì)設(shè)置wifey名字時(shí),hubby的名字沒(méi)有改變?
因?yàn)樵趐erson列表的兩個(gè)對(duì)象中,第一個(gè)是字符串,不可變,第二個(gè)是可變的列表,當(dāng)進(jìn)行淺拷貝時(shí),字符串被顯式的拷貝,并新創(chuàng)建一個(gè)字符串對(duì)象,而列表元素,只是把它的引用復(fù)制了一下。
改變前
>>> id(x) for x in hubby>>> [4344118896, 4349387912]>>> [id(x) for x in wifey]>>> [4344118896, 4349387912] # 相同改變后
>>> id(x) for x in hubby>>> [4350395376, 4349387912]>>> id(x) for x in wifey>>> [4350586624, 4349387912] #列表第1個(gè)值的id已經(jīng)不同,說(shuō)明是另外創(chuàng)建了對(duì)象。要?jiǎng)?chuàng)建分離的對(duì)象,需要使用深拷貝
>>> person = ['name', ['saving', 100.0]] >>> hubby = person>>> import copy>>> wifey = copy.deepcopy(person)>>> [id(x) for x in person, hubby, wifey]>>> [4401609544, 4401609544, 4402474376] #可以看到,wifey的id已經(jīng)不一樣了 >>> hubby[0] = 'joe'>>> wifey[0] = 'jane'>>> hubby,wifey>>> (['joe', ['saving', 100.0]], ['jane', ['saving', 100.0]])>>> hubby[1][1] = 50.00>>> hubby,wifey>>> (['joe', ['saving', 50.0]], ['jane', ['saving', 100.0]]) # 此時(shí),jane的saving不再隨著joe改變 #驗(yàn)證一下id看是不是真的改變了 >>> [id(x) for x in hubby]>>> [4402580776, 4401564632]>>> [id(x) for x in wifey]>>> [4401200608, 4401248232]#四個(gè)對(duì)象都是不一樣的了關(guān)于拷貝的警告 1 非容器類(lèi)型(比如數(shù)字,字符串,和其他‘原子’類(lèi)型的對(duì)象沒(méi)有拷貝一說(shuō),淺拷貝是用完全切片來(lái)完成的,第二,如果元組變量,只包含原子類(lèi)型對(duì)象,對(duì)它的深拷貝將不會(huì)進(jìn)行,如果把person里第二個(gè)元素改成(),即使使用深拷貝也只能得到一個(gè)淺拷貝
新聞熱點(diǎn)
疑難解答
網(wǎng)友關(guān)注