python列表(list)的复制
python复制列表的方法有很多,但对于不同的方法,复制的效果却不一样。
1.赋值运算:
直接使用赋值运算符进行赋值时,其实只是把new的地址指向了old的地址,也就是说new和old指向同一块内存。
old = [1,[2,2],3]
new = []
new = old
new[0] = 2
print(new)
'''
[2,[2,2],3]
'''
print(old)
'''
[2,[2,2],3]
'''
改变new的值,old也会改变
2.copy()方法:
copy方法对于列表的第一层实现了复制,但对于内嵌的其他层也只是复制了地址。因为嵌套的List保存的是地址,复制过去的时候是把地址复制过去了,嵌套的List在内存中指向的还是同一个。
old = [1,[2,2],3]
new = old.copy()
new[0] = 4
new[1][0] = 5
print(new)
'''
[4,[5,2],3]
'''
print(old)
'''
[1,[5,2],3]
'''
3.使用列表生成
同样只能实现第一层的复制。
old = [1,[2,2],3]
new = [i for i in old]
new[0] = 4
new[1][0] = 5
print(new)
'''
[4,[5,2],3]
'''
print(old)
'''
[1,[5,2],3]
'''
4.for循环遍历赋值
同样只能实现第一层的复制。
old = [1,[2,2],3]
new = []
for i in range(len(old)):
new.append(old[i])
new[0] = 4
new[1][0] = 5
print(new)
'''
[4,[5,2],3]
'''
print(old)
'''
[1,[5,2],3]
'''
5.列表切片
同样只能实现第一层的复制。
old = [1,[2,2],3]
new = old[:]
new[0] = 4
new[1][0] = 5
print(new)
'''
[4,[5,2],3]
'''
print(old)
'''
[1,[5,2],3]
'''
6.使用深拷贝deepcopy()方法
此方法无论列表多少层,得到的新列表都是和老列表是无关的,是相互独立的。新列表存的是值,而不是地址。
import copy
old = [1,[2,2],3]
new = copy.deepcopy(old)
new[0] = 4
new[1][0] = 5
print(new)
'''
[4,[5,2],3]
'''
print(old)
'''
[1,[2,2],3]
'''