淺拷貝只拷貝了最頂層的,深拷貝拷貝了所有
拷貝牽扯到以下幾種形式:
- 賦值操作符=
- copy.copy
- copy.deepcopy
- 列表中的切片[:]
- 字典中的拷貝.copy()
- 列表作為函數參數
1. 當拷貝內容為可變類型時
首先以列表為例,來看python中的深拷貝與淺拷貝:
如下圖,a和b的地址是一樣的,b只是指向了a的地址。
copy.copy后,d只是開辟了一段新的空間,拷貝了c的引用
copy.deepcopy,是直接拷貝了內容。
簡單總結:=就是指向原地址,copy.copy會開辟一個新地址,內部拷貝了可變類型當時的引用;copy.deepcopy所有元素都拷貝
2. 當拷貝內容為不可變類型時
這里以元組為例
簡單總結:當拷貝的內容為不可變類型,無論哪種方法都只是簡單引用,不會開辟新地址
3. 當拷貝內容為不可變類型但包含可變類型
簡單總結:只要包含可變元素,deepcopy就完全拷貝
4. 列表切片中的拷貝
簡單總結:列表切片中的拷貝,可copy.copy一樣,是淺拷貝
5. 字典中的拷貝
基本認識:字典是無序的,每一個key通過哈希來得到,字典中存儲的是key的引用
6. 列表作為函數參數傳入