轉自:微點閱讀 https://www.weidianyuedu.com
1、淺拷貝和深拷貝
淺拷貝複制指向某個對象的位址(指針),而不複制對象本身,新對象和原對象共享同一記憶體。
深拷貝會額外建立一個新的對象,新對象跟原對象并不共享記憶體,修改新對象不會影響到原對象。
指派其實就是引用了原對象。兩者指向同一記憶體,兩個對象是關聯的,無論哪個對象發生改變都會影響到另一個。
2、直接指派
使用=來複制一個清單,實際上不僅複制了其中的内容,也複制了其記憶體位址,即引用了原清單。使用id()方法檢視記憶體位址也是一樣的。修改其中一個清單,也會直接更改另一個清單。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
輸出:
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
2030264836936 2030264836936
['g', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
Process finished with exit code 0
3、for循環
使用for循環進行拷貝,僅第一層為深拷貝,對其它層依然是淺拷貝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
輸出:
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
Process finished with exit code 0
4、切片
使用切片方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。
1 2 3 4 5 6 7 8 9 10 11 12 | |
輸出:
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
Process finished with exit code 0
5、copy()方法
(1)list.copy()方法
使用list.copy()方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。由于清單中嵌套的清單實際儲存的是位址,依然指向同一個記憶體位址。
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
輸出:
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
Process finished with exit code 0
(2)copy.copy()方法
使用copy.copy()方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
輸出:
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['f', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
Process finished with exit code 0
6、deepcopy()方法
使用copy.deepcopy()方法進行拷貝,對所有層均為深拷貝,改變新清單并不會影響到原清單,推薦使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
輸出:
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['a', ['b', 'c', 'd'], ['e', 'f']]
['g', ['f', 'c', 'd'], ['e', 'f']]
Process finished with exit code 0
到此這篇關于python中list清單複制的幾種方法(指派、切片、copy(),deepcopy())的文章就介紹到這了。