现有一个列表a如下,想对其进行复制或者拷贝:
a = [[1, 2, 3], [4, 5, 6]]
1. 引用
将a的引用赋值给b:
b = a
可以认为不是拷贝,只是将a的引用给了b(起了个别名),它们指向的是同一个内存。改变a或者b中的某一个,另外一个都会发生相应的改变。
示例:
a = [[1, 2, 3], [4, 5, 6]]
b = a
a[0] = 1
print(b)
b[0] = 2
print(a)
输出:
[1, [4, 5, 6]]
[2, [4, 5, 6]]
2. 浅复制
浅复制的3种方式:
b = a[ : ]
b = a.copy()
b = [i for i in a]
目的是拷贝到另一块内存,但只复制了一层。改变一个列表的第一层元素,另一个列表不会变,如a[0] = 1 ,b不会改变;但改变第二层则b发生改变,如a[0].append(7)。
示例:
a = [[1, 2, 3], [4, 5, 6]]
b = a.copy()
print(b)
a[0] = 1 # 相当于改变了a[0]的引用(指向),对b[0]是没影响的
print(b)
a[1].append(7) # a[1]和b[1]指向的都是同一个列表,a[1]改变,b[1]也改变
print(b)
输出:
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6, 7]]
3. 深复制
深复制:
b = copy.deepcopy(a)
深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。深拷贝之后,两者互不影响。
示例:
import copy
a = [[1, 2, 3], [4, 5, 6]]
b = copy.deepcopy(a)
a[1].append(7) #改变a的第二层,b也不会受影响
print(b)
输出:
[[1, 2, 3], [4, 5, 6]]