📜  python 复制二维列表 - Python (1)

📅  最后修改于: 2023-12-03 15:34:10.768000             🧑  作者: Mango

Python 复制二维列表

在 Python 中,复制一个二维列表需要特别注意,在处理中需要格外小心。如果处理不当,将对程序的逻辑和结果产生负面影响。本文将介绍如何在 Python 中正确地复制二维列表。

什么是二维列表

二维列表是一个包含其他列表的列表,每个子列表都是同等长度的,通常用于表示矩阵、图像等。

# 一个简单的二维列表
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
复制方式

Python 中,列表内部有浅拷贝和深拷贝两种复制方式。

  • 浅拷贝:复制父列表,但不复制子列表,两个列表中的子列表指向同一块内存地址。
  • 深拷贝:复制父列表和子列表,两个列表独立,完全拷贝所有元素。
复制二维列表的方法

1.使用 copy() 方法

使用列表本身的 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]]

2.使用 copy.deepcopy() 方法

使用 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.使用列表生成式

使用列表生成式创建一个新的列表,并保证子列表与原始列表不相干。

# 复制方法 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() 方法都可以复制列表并返回一个新的、独立的列表对象。如果需要处理大型数据集,使用复制引用是一个更好的选择,可以节省内存并增加效率。