賦值
對於復制的操作,最簡單的就是賦值,指的是新建一個對象的引用,新建目標對象與原來的目標對象指向同一個內存地址,因而,始終保持一致。
list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]] list2 = list1 list1.append(9) print(list1) print(list2) list1[5][0] = 10 print(list1) print(list2) list1[5] = 10 print(list1) print(list2)
淺拷貝
淺拷貝顧名思義就是拷貝的比較淺,我們可以把賦值認為是新建了一個對象的引用,把原來被對象內存空間的數據指向新的變量,這時同一塊內存空間指向兩個變量。淺拷貝與賦值不同,既然是拷貝,那么就是要開辟一塊新的內存空間,復制的是原來被拷貝對象內多個元素對象的引用,有幾個元素對象就賦值幾個元素對象的引用。因此,被淺拷貝對象內的元素改變,會引起淺拷貝對象內元素的改變;被拷貝對象添加元素,拷貝對象不再添加元素(因為沒有一個新的引用);被拷貝對象刪除元素,拷貝對象也刪除元素(元素都已經刪了,雖然引用存在,但是並沒有什么卵用)。
import copy list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]] list2 = copy.copy(list1) print(list1) print(list2) list1[5].append(9) print(list1) print(list2) list1.append(6) print(list1) print(list2) list1.pop() print(list1) print(list2)
深拷貝
深拷貝其實與淺拷貝有本質的區別,它不會復制任何的引用,對象內的所有元素,子元素,孫子元素,重孫元素,曾孫元素的數據都是由復制而來。它的實現原理就是遞歸,只要任意元素內仍然有子元素,就會復制子元素的數據放到新的內存地址。既然這樣,在使用深拷貝后,被拷貝對象的改變,不會引起拷貝對象的任何改變。
import copy list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]] list2 = copy.deepcopy(list1) print(list1) print(list2) list1[5].append(9) print(list1) print(list2) list1.append(6) print(list1) print(list2) list1.pop() print(list1) print(list2)
總結:
- 賦值:新建一個原來對象內存地址的引用,不開辟新的內存空間;
- 淺拷貝:新建多個原來對象內一級子元素內存地址的引用,開辟新的內存空間;
- 深拷貝:復制原來對象內的所有N級子元素的數據,開辟新的內存空間。