一、Python深拷貝、淺拷貝的區(qū)別
淺拷貝是指創(chuàng)建一個(gè)新的對(duì)象,該對(duì)象與原始對(duì)象共享同一內(nèi)存地址,新對(duì)象中包含原始對(duì)象的引用。因此,當(dāng)更改原始對(duì)象或淺拷貝對(duì)象時(shí),它們都會(huì)受到影響。在 Python 中,可以使用 copy()
方法或者切片操作符來(lái)進(jìn)行淺拷貝。
深拷貝是指創(chuàng)建一個(gè)新的對(duì)象,該對(duì)象與原始對(duì)象沒(méi)有任何關(guān)聯(lián),新對(duì)象中包含了原始對(duì)象所有子對(duì)象的拷貝。因此,當(dāng)更改原始對(duì)象時(shí),深拷貝對(duì)象不會(huì)受到影響。在 Python 中,可以使用 deepcopy()
方法來(lái)進(jìn)行深拷貝。
Python中的不可變對(duì)象包括數(shù)字、字符串和元組等,不可變對(duì)象的值在創(chuàng)建之后不能被修改,只能被替換。而可變對(duì)象包括列表、字典和集合等,它們的值在創(chuàng)建之后可以被修改。在進(jìn)行淺拷貝時(shí),不可變對(duì)象和可變對(duì)象的行為是不同的:
對(duì)于不可變對(duì)象,淺拷貝會(huì)直接引用原對(duì)象的值,不會(huì)創(chuàng)建新的對(duì)象。這是因?yàn)椴豢勺儗?duì)象的值不會(huì)改變,所以只需要在新對(duì)象中保存對(duì)原對(duì)象的引用即可。對(duì)于可變對(duì)象,淺拷貝會(huì)創(chuàng)建一個(gè)新對(duì)象,并將原對(duì)象中的值復(fù)制到新對(duì)象中。但是,對(duì)于原對(duì)象中的子對(duì)象,淺拷貝只會(huì)復(fù)制其引用,而不是創(chuàng)建新的子對(duì)象。對(duì)于深拷貝,無(wú)論對(duì)象是可變還是不可變的,都會(huì)被復(fù)制到一個(gè)新的對(duì)象中,包括原對(duì)象中的所有子對(duì)象。這意味著,即使原對(duì)象中包含可變對(duì)象,深拷貝也會(huì)創(chuàng)建一個(gè)全新的對(duì)象來(lái)保存它們的值,而不是只復(fù)制其引用。
對(duì)于淺拷貝,會(huì)創(chuàng)建一個(gè)新列表,其中的元素都是對(duì)原列表中元素的引用。所以如果我們修改了原列表中的一個(gè)子列表,那么淺拷貝出來(lái)的列表也會(huì)受到影響
對(duì)于深拷貝,不管原列表中有多少層嵌套,深拷貝都會(huì)遞歸地復(fù)制每一個(gè)子對(duì)象,并創(chuàng)建一個(gè)全新的對(duì)象來(lái)保存它們。所以如果我們修改原列表中的一個(gè)子列表,深拷貝出來(lái)的列表不會(huì)受到影響。