创建列表时浅拷贝与深拷贝的问题
一般来说,深拷贝就是直接创建的意思
当我们要创建一维列表时,浅拷贝与深拷贝基本没有差别:
arr_1 = [0] * 5 # 浅拷贝
arr_2 = [0 for _ in range(5)] # 深拷贝
print(arr_1) # [0, 0, 0, 0, 0]
print(arr_2) # [0, 0, 0, 0, 0]
arr_1[0] = 1
arr_2[0] = 1
print(arr_1) # [1, 0, 0, 0, 0]
print(arr_2) # [1, 0, 0, 0, 0]但是要创建二维列表时浅拷贝就会出现问题
arr_1 = [[0] * 2] * 3 # *3仅仅是将[0,0]浅拷贝了3份,并不是真正的创建
arr_2 = [[0 for _ in range(2)] for _ in range(3)]
print(arr_1) # [[0, 0], [0, 0], [0, 0]]
print(arr_2) # [[0, 0], [0, 0], [0, 0]]
arr_1[0][1] = 2
arr_2[0][1] = 3
print(arr_1) # [[0, 2], [0, 2], [0, 2]] =>每个一维列表对应的元素都发生了改变
print(arr_2) # [[0, 3], [0, 0], [0, 0]]所以 在创建多维列表时,要用深拷贝进行创建
补充:
在进行二维数组输入时,两种方法进行创建初始化数组都是可以的:
n, m = map(int, input().split())
# nums = [[0 for _ in range(m)] for _ in range(n)] # 深拷贝
nums = [[0] * m] * n # 浅拷贝
for i in range(n):
nums[i] = list(map(int, input().split()))
print(nums)
# 输入:
3 4
1 2 3 4
5 6 7 8
9 10 11 12
# 输出:[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
文章讨论了在Python编程中,浅拷贝和深拷贝在创建一维和二维列表时的不同行为。对于一维列表,浅拷贝和深拷贝的效果相似,但在二维列表中,浅拷贝会导致意外的共享引用问题,而深拷贝能确保独立的副本。文章举例说明了如何正确使用深拷贝来避免这种问题,并提供了输入处理的示例代码。
1436

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



