三种操作不同只体现在不可变类型的修改上
1. =操作
两指针指向同一块内存地址, 一个改变都会改变
l1 = [1, 2, 3]
l2 = l1
print(l1, l2)
# [1, 2, 3] [1, 2, 3]
l2[0] = 4
print(l1, l2)
# [4, 2, 3] [4, 2, 3]
l2.append(4)
print(l1, l2)
# [1, 2, 3, 4] [1, 2, 3, 4]
2. 浅拷贝
- 使用内置模块 copy.copy()
- 切片操作也属于浅拷贝
- 与=操作的区别在于, 浅拷贝会拷贝父对象, 也就是最外层的可变类型, 内部的子可变对象不会拷贝
- 所以, 修改内部的可变类型子对象, 两个变量都会被改变
import copy
l1 = [1, [2], 3]
l2 = copy.copy(l1)
print(l1, l2)
# [1, [2], 3] [1, [2], 3]
# 可变元素中潜逃的可变元素修改, 则都会改变
l2[1].append(3)
print(l1, l2)
# [1, [2, 3], 3] [1, [2, 3], 3]
# 可变元素中的不可变元素更改, 则只会改变一个
l2[0] = 2
print(l1, l2)
# [1, [2, 3], 3] [2, [2, 3], 3]
# 可变元素中追加元素, 则只会改变一个
l2.append(4)
print(l1, l2)
# [1, [2, 3], 3] [2, [2, 3], 3, 4]
3. 深拷贝
完全拷贝, 拷贝父对象及子对象, 也就是说只有值相同, 地址完全不同, 所以修改任意一个元素, 都不会影响另一个内部的值
import copy
l1 = [1, [2], 3]
l2 = copy.deepcopy(l1)
print(l1, l2)
# [1, [2], 3] [1, [2], 3]
l2[1].append(3)
print(l1, l2)
# [1, [2], 3] [1, [2, 3], 3]
l2[0] = 2
print(l1, l2)
# [1, [2], 3] [2, [2, 3], 3]
l2.append(4)
print(l1, l2)
# [1, [2], 3] [2, [2, 3], 3, 4]