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