python浅拷贝的说法_Python中List的复制(直接复制、浅拷贝、深拷贝)
直接賦值:
如果用 = 直接賦值,是非拷貝方法。
這兩個列表是等價的,修改其中任何一個列表都會影響到另一個列表。
old = [1,[1,2,3],3]
new = []
for i in range(len(old)):
new.append(old[i])
new[0] = 3
new[1][0] = 3
'''
-----------------------
Before:
[1, [1, 2, 3], 3]
[1, [1, 2, 3], 3]
After:
[3, [3, 2, 3], 3]
[3, [3, 2, 3], 3]
-----------------------
'''
淺拷貝:
1.copy()方法
對于List來說,其第一層,是實現(xiàn)了深拷貝,但對于其內(nèi)嵌套的List,仍然是淺拷貝。
因為嵌套的List保存的是地址,復(fù)制過去的時候是把地址復(fù)制過去了,嵌套的List在內(nèi)存中指向的還是同一個。
old = [1,[1,2,3],3]
new = old.copy()
new[0] = 3
new[1][0] =3
'''
---------------------
Before:
[1, [1, 2, 3], 3]
[1, [1, 2, 3], 3]
After:
[1, [3, 2, 3], 3]
[3, [3, 2, 3], 3]
---------------------
'''
2.使用列表生成式
使用列表生成式產(chǎn)生新列表也是一個淺拷貝方法,只對第一層實現(xiàn)深拷貝。
old = [1,[1,2,3],3]
new = [i for i in old]
new[0] = 3
new[1][0] = 3
'''
----------------------
Before
[1, [1, 2, 3], 3]
[1, [1, 2, 3], 3]
After
[1, [3, 2, 3], 3]
[3, [3, 2, 3], 3]
----------------------
'''
3.for循環(huán)遍歷
通過for循環(huán)遍歷,將元素一個個添加到新列表中。這也是一個淺拷貝方法,只對第一層實現(xiàn)深拷貝。
old = [1,[1,2,3],3]
new = []
for i in range(len(old)):
new.append(old[i])
new[0] = 3
new[1][0] = 3
'''
-----------------------
Before:
[1, [1, 2, 3], 3]
[1, [1, 2, 3], 3]
After:
[1, [3, 2, 3], 3]
[3, [3, 2, 3], 3]
-----------------------
'''
4.使用切片
通過使用 [ : ] 切片,可以淺拷貝整個列表,同樣的,只對第一層實現(xiàn)深拷貝。
old = [1,[1,2,3],3]
new = old[:]
new[0] = 3
new[1][0] = 3
'''
------------------
Before:
[1, [1, 2, 3], 3]
[1, [1, 2, 3], 3]
After:
[1, [3, 2, 3], 3]
[3, [3, 2, 3], 3]
------------------
'''
深拷貝:
如果用deepcopy()方法,則無論多少層,無論怎樣的形式,得到的新列表都是和原來無關(guān)的,這是最安全最清爽最有效的方法。
需要import copy
import copy
old = [1,[1,2,3],3]
new = copy.deepcopy(old)
new[0] = 3
new[1][0] = 3
'''
-----------------------
Before:
[1, [1, 2, 3], 3]
[1, [1, 2, 3], 3]
After:
[1, [1, 2, 3], 3]
[3, [3, 2, 3], 3]
-----------------------
'''
總結(jié)
以上是生活随笔為你收集整理的python浅拷贝的说法_Python中List的复制(直接复制、浅拷贝、深拷贝)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 8 update 11_从Ja
- 下一篇: Python 元组(Tuple)操作详解