📅  最后修改于: 2023-12-03 15:34:10.768000             🧑  作者: Mango
在 Python 中,复制一个二维列表需要特别注意,在处理中需要格外小心。如果处理不当,将对程序的逻辑和结果产生负面影响。本文将介绍如何在 Python 中正确地复制二维列表。
二维列表是一个包含其他列表的列表,每个子列表都是同等长度的,通常用于表示矩阵、图像等。
# 一个简单的二维列表
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
Python 中,列表内部有浅拷贝和深拷贝两种复制方式。
使用列表本身的 copy()
方法是一种非常容易理解和实现的复制方式。使用 copy()
方法返回一个浅拷贝的列表对象。
# 复制方法 1
matrix1 = matrix.copy()
# 修改子列表后,发现两个列表中的子列表指向相同的内存地址
matrix1[0][0] = 10
print(matrix) # [[10, 2, 3], [4, 5, 6], [7, 8, 9]]
print(matrix1) # [[10, 2, 3], [4, 5, 6], [7, 8, 9]]
使用 copy.deepcopy()
方法可以复制子列表并返回一个全新的、独立的列表对象,与原始列表没有任何关系。
import copy
# 复制方法 2
matrix2 = copy.deepcopy(matrix)
# 修改子列表后,发现两个列表中的子列表指向不同的内存地址
matrix2[0][0] = 20
print(matrix) # [[10, 2, 3], [4, 5, 6], [7, 8, 9]]
print(matrix2) # [[20, 2, 3], [4, 5, 6], [7, 8, 9]]
使用列表生成式创建一个新的列表,并保证子列表与原始列表不相干。
# 复制方法 3
matrix3 = [row[:] for row in matrix]
# 修改子列表后,发现两个列表中的子列表指向不同的内存地址
matrix3[0][0] = 30
print(matrix) # [[10, 2, 3], [4, 5, 6], [7, 8, 9]]
print(matrix3) # [[30, 2, 3], [4, 5, 6], [7, 8, 9]]
对于大型数据集,复制一个列表时需要耗费大量内存。一个可行的方法是在内存中创建一个指向该列表的指针,而不是创建一个新的列表。这个技术也称为“复制引用”。
# 大型数据集复制示例
import sys
matrix2 = matrix
print(sys.getsizeof(matrix2)) # 96
在 Python 中复制二维列表是一个需要特别小心的操作。使用 copy()
方法和 deepcopy()
方法都可以复制列表并返回一个新的、独立的列表对象。如果需要处理大型数据集,使用复制引用是一个更好的选择,可以节省内存并增加效率。