关于python列表的深浅拷贝问题
拷贝需要用到内置的copy模块
import copy
浅拷贝:
引用赋值,list.copy(),copy.cpoy(list)
- 一维列表
l1 = [1, 2, 3, 4]
l2 = l1.copy()
l3 = l1
l4 = copy.copy(l1)
print(l1, l2, l3, l4, sep='\n')
'''
结果为:
l1--->[1, 2, 3, 4]
l2--->[1, 2, 3, 4]
l3--->[1, 2, 3, 4]
l4--->[1, 2, 3, 4]
'''
# 现在修改l1
l1[1] = 9
print(l1, l2, l3, l4, sep='\n')
'''
结果为:
l1--->[1, 9, 3, 4]
l2--->[1, 2, 3, 4]
l3--->[1, 9, 3, 4]
l4--->[1, 2, 3, 4]
'''
l1.append(99)
print(l1, l2, l3, l4, sep='\n')
'''
结果为:
l1--->[1, 9, 3, 4, 99]
l2--->[1, 2, 3, 4]
l3--->[1, 9, 3, 4, 99]
l4--->[1, 2, 3, 4]
'''
其中引用赋值是两个变量都指向同一个列表,可以理解为是一种拷贝,但是引用赋值都会随着原列表变化而变化
一维列表浅拷贝原列表变化(增删改),新列表不会改变,引用赋值除外
- 二维列表
l1 = [1, 2, [5, 6], 3, 4]
l2 = l1.copy()
l3 = l1
l4 = copy.copy(l1)
print(l1, l2, l3, l4, sep='\n')
'''
结果为:
l1--->[1, 2, [5, 6], 3, 4]
l2--->[1, 2, [5, 6], 3, 4]
l3--->[1, 2, [5, 6], 3, 4]
l4--->[1, 2, [5, 6], 3, 4]
'''
# 现在修改l1中的内层嵌套列表
l1[2].append(7)
print(l1, l2, l3, l4, sep='\n')
'''
结果为:
l1--->[1, 2, [5, 6, 7], 3, 4]
l2--->[1, 2, [5, 6, 7], 3, 4]
l3--->[1, 2, [5, 6, 7], 3, 4]
l4--->[1, 2, [5, 6, 7], 3, 4]
'''
# 修改l1的外层元素
l1.append(99)
print(l1, l2, l3, l4, sep='\n')
'''
结果为:
l1--->[1, 2, [5, 6, 7], 3, 4, 99]
l2--->[1, 2, [5, 6, 7], 3, 4]
l3--->[1, 2, [5, 6, 7], 3, 4, 99]
l4--->[1, 2, [5, 6, 7], 3, 4]
'''
二维列表浅拷贝原列表变化(增删改),修改外层元素时新列表不会改变,但是修改内层嵌套的列表时,新列表会跟着改变,引用赋值会一直跟着变
原因是浅拷贝只拷贝了列表第一层元素的地址,对于内层小列表来说,只拷贝了小列表的容器地址,内在的元素并没有拷贝,所以在小列表中添加元素,小列表(容器)本身的地址并没有变化,只是里面装的东西变了
深拷贝:
list2 = copy.deepcopy(list1)
- 一维列表
l1 = [1, 2, 3, 4]
l2 = copy.deepcopy(l1)
print(l1, l2, sep='\n')
'''
结果为:
l1--->[1, 2, 3, 4]
l2--->[1, 2, 3, 4]
'''
# 修改l1的外层元素
l1.append(99)
print(l1, l2, sep='\n')
'''
结果为:
l1--->[1, 2, 3, 4, 99]
l2--->[1, 2, 3, 4]
'''
一维列表深拷贝与浅拷贝一样,原列表变化新列表不会变
- 二维列表
l1 = [1, 2, [5, 6], 3, 4]
l2 = copy.deepcopy(l1)
print(l1, l2, sep='\n')
'''
结果为:
l1--->[1, 2, [5, 6], 3, 4]
l2--->[1, 2, [5, 6], 3, 4]
'''
# 现在修改l1中的内层嵌套列表
l1[2].append(7)
print(l1, l2, sep='\n')
'''
结果为:
l1--->[1, 2, [5, 6, 7], 3, 4]
l2--->[1, 2, [5, 6], 3, 4]
'''
# 修改l1的外层元素
l1.append(99)
print(l1, l2, sep='\n')
'''
结果为:
l1--->[1, 2, [5, 6, 7], 3, 4, 99]
l2--->[1, 2, [5, 6], 3, 4]
'''
二维列表深拷贝,原列表改变,新列表都不改变,因为深拷贝是将列表内所有最内层的元素的地址都拷贝下来,相当于把容器里面装的东西都复制了一份,再给原来的容器添加东西,复制出来的容器不会受影响,两者之间已经没有关系了
本文探讨Python列表的深浅拷贝差异。浅拷贝仅复制列表第一层元素的地址,一维列表拷贝后原列表变化不影响新列表,但二维列表中内层列表的修改会影响新列表。深拷贝则复制所有内层元素的地址,确保原列表变化不会影响新列表。

4460

被折叠的 条评论
为什么被折叠?



