python 浅拷贝和深拷贝

赋值语句 vs 浅拷贝

赋值语句(数据完全共享)

l1 = [randint(0, 100) for i in range(0, 10)]
l2 = l1
print(l1, l2)
l1[0] = 100
print(l1, l2)

通过赋值,l2 和l1指向同一个引用对象,改变l1的元素,l2也会改变
输出:

[48, 26, 48, 64, 73, 73, 84, 8, 63, 71] [48, 26, 48, 64, 73, 73, 84, 8, 63, 71]
[100, 26, 48, 64, 73, 73, 84, 8, 63, 71] [100, 26, 48, 64, 73, 73, 84, 8, 63, 71]

浅拷贝(数据半共享):

l1 = [randint(0, 100) for i in range(0, 10)]
l2 = copy(l1) #浅拷贝
print(l1, l2)
l1[0] = 100
print(l1, l2)

通过浅拷贝,l2 和l1指向不同的引用对象,改变l1子元素,并不会改变l2的元素
输出:

[16, 64, 82, 92, 44, 75, 37, 28, 68, 23] [16, 64, 82, 92, 44, 75, 37, 28, 68, 23]
[100, 64, 82, 92, 44, 75, 37, 28, 68, 23] [16, 64, 82, 92, 44, 75, 37, 28, 68, 23]

浅拷贝 VS 深拷贝

浅拷贝:

l3 = [0, [1, 2, 3], 4]
l4 = copy(l3)

print(l3, l4)
l3[1] = 5
print(l3, l4)

通过浅拷贝,l3 和 l4指向不同的引用对象,改变l3最上层的子元素,并不会改变l4的元素
输出:

[0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
[0, 5, 4] [0, [1, 2, 3], 4]

如果l3的某个子元素是可变引用对象,浅拷贝在拷贝时,只拷贝了最上层子元素的引用对象,最上层子元素对象里的子元素却指向同一个引用对象, 改变l3子元素的子元素会使得l4也发生改变

l3 = [0, [1, 2, 3], 4]
l4 = copy(l3)

print(l3, l4)
l3[1][0] = 5
print(l3, l4)

输出:

[0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
[0, [5, 2, 3], 4] [0, [5, 2, 3], 4]

深拷贝(数据完全不共享):
深拷贝会拷贝所有元素及其子元素的引用对象

l3 = [0, [1, 2, 3], 4]
l4 = deepcopy(l3)

print(l3, l4)
l3[1][0]= 5
print(l3, l4)

输出:

[0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
[0, [5, 2, 3], 4] [0, [1, 2, 3], 4]

你可能感兴趣的:(python 浅拷贝和深拷贝)