日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python中list列表復制的幾種方法(賦值、切片、copy(),deepcopy())_python

作者:程序遇上智能星空 ? 更新時間: 2022-10-17 編程語言

1、淺拷貝和深拷貝

淺拷貝復制指向某個對象的地址(指針),而不復制對象本身,新對象和原對象共享同一內存。

深拷貝會額外創建一個新的對象,新對象跟原對象并不共享內存,修改新對象不會影響到原對象。

賦值其實就是引用了原對象。兩者指向同一內存,兩個對象是聯動的,無論哪個對象發生改變都會影響到另一個。

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循環

使用for循環進行拷貝,僅第一層為深拷貝,對其它層依然是淺拷貝。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
if __name__ == '__main__':
    a = ["a", ["b", "c", "d"], ["e", "f"]]
    b = []
    # 使用for循環進行拷貝,僅第一層為深拷貝
    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

原文鏈接:https://blog.csdn.net/kevinjin2011/article/details/125533775

欄目分類
最近更新