python中l(wèi)ist列表復制的幾種方法(賦值、切片、copy(),deepcopy())
1、淺拷貝和深拷貝
淺拷貝復制指向某個對象的地址(指針),而不復制對象本身,新對象和原對象共享同一內存。
深拷貝會額外創(chuàng)建一個新的對象,新對象跟原對象并不共享內存,修改新對象不會影響到原對象。
賦值其實就是引用了原對象。兩者指向同一內存,兩個對象是聯(lián)動的,無論哪個對象發(fā)生改變都會影響到另一個。
2、直接賦值
使用=來復制一個列表,實際上不僅復制了其中的內容,也復制了其內存地址,即引用了原列表。使用id()方法查看內存地址也是一樣的。修改其中一個列表,也會直接更改另一個列表。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
a = ["a", ["b", "c", "d"], ["e", "f"]]
# 直接復制,即引用列表
b = a
print(a)
print(b)
# 通過id()查看內存地址,為一樣的
print(id(a), id(b))
b[0] = "g"
b[1][0] = "f"
print(a)
print(b)
輸出:
['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循環(huán)
使用for循環(huán)進行拷貝,僅第一層為深拷貝,對其它層依然是淺拷貝。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
a = ["a", ["b", "c", "d"], ["e", "f"]]
b = []
# 使用for循環(huán)進行拷貝,僅第一層為深拷貝
for i in a:
b.append(i)
print(a)
print(b)
b[0] = "g"
b[1][0] = "f"
print(a)
print(b)
輸出:
['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、切片
使用切片方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
a = ["a", ["b", "c", "d"], ["e", "f"]]
# 使用切片進行拷貝,僅第一層為深拷貝
b = a[:]
print(a)
print(b)
b[0] = "g"
b[1][0] = "f"
print(a)
print(b)
輸出:
['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()方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。由于列表中嵌套的列表實際保存的是地址,依然指向同一個內存地址。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
a = ["a", ["b", "c", "d"], ["e", "f"]]
# 使用list.copy()方法進行拷貝,僅第一層為深拷貝
b = a.copy()
print(a)
print(b)
b[0] = "g"
b[1][0] = "f"
print(a)
print(b)
輸出:
['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()方法進行拷貝,也僅對第一層為深拷貝,對其它層依然是淺拷貝。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import copy
if __name__ == '__main__':
a = ["a", ["b", "c", "d"], ["e", "f"]]
# 使用copy.copy()方法進行拷貝,僅第一層為深拷貝
b = copy.copy(a)
print(a)
print(b)
b[0] = "g"
b[1][0] = "f"
print(a)
print(b)
輸出:
['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()方法進行拷貝,對所有層均為深拷貝,改變新列表并不會影響到原列表,推薦使用。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import copy
if __name__ == '__main__':
a = ["a", ["b", "c", "d"], ["e", "f"]]
# 使用copy.deepcopy()方法進行拷貝,對所有層均為深拷貝
b = copy.deepcopy(a)
print(a)
print(b)
b[0] = "g"
b[1][0] = "f"
print(a)
print(b)
輸出:
['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中l(wèi)ist列表復制的幾種方法(賦值、切片、copy(),deepcopy())的文章就介紹到這了,更多相關python list列表復制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python中利用numpy.array()實現(xiàn)倆個數(shù)值列表的對應相加方法
今天小編就為大家分享一篇python中利用numpy.array()實現(xiàn)倆個數(shù)值列表的對應相加方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
解決windows上安裝tensorflow時報錯,“DLL load failed: 找不到指定的模塊”的問題
這篇文章主要介紹了解決windows上安裝tensorflow時報錯,“DLL load failed: 找不到指定的模塊”的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Python性能分析工具pyinstrument提高代碼效率
今天分享一個超級實用的 Python 性能分析工具 pyinstrument ,可以快速找到代碼運行最慢的部分,幫助提高代碼的性能。支持 Python 3.7+ 且能夠分析異步代碼,僅需一條命令即可顯示具體代碼的耗時。經(jīng)常寫 Python 的小伙伴一定要用一下2021-09-09
python數(shù)據(jù)分析apply(),map(),applymap()用法
這篇文章主要介紹了python數(shù)據(jù)分析apply(),map(),applymap()用法,可以方便地實現(xiàn)對批量數(shù)據(jù)的自定義操作。用法歸納如下,需要的朋友可以參考一下2022-03-03
利用Python+Selenium破解春秋航空網(wǎng)滑塊驗證碼的實戰(zhàn)過程
本文給大家介紹使用Python+Selenium破解春秋航空網(wǎng)滑塊驗證碼的實戰(zhàn)過程,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-08-08

