说说在 Python 中如何快速复制序列

说说在 Python 中如何快速复制序列
最新回答
微云淡月

2023-12-16 10:42:36

在 Python 中,复制序列可以通过多种方式实现,但需要注意不同方法对元素引用的处理差异。以下是具体方法和注意事项:

1. 基本复制方法序列乘法复制
  • 语法:将序列乘以整数 n,生成新序列(原序列重复 n 次拼接)。
  • 特点

    适用于简单序列(如数字、字符串)。

    不修改原序列,返回新对象。

  • 示例:l = [1, 2, 3]l2 = l * 3 # 结果: [1, 2, 3, 1, 2, 3, 1, 2, 3]s = 'deniro's2 = s * 5 # 结果: 'denirodenirodenirodenirodeniro'
切片复制
  • 语法:使用 [:] 创建序列的浅拷贝。
  • 特点

    适用于列表、字符串等可切片对象。

    同样不修改原序列。

  • 示例:l = [1, 2, 3]l2 = l[:] # 结果: [1, 2, 3]
2. 列表复制的陷阱

当列表元素为可变对象(如嵌套列表)时,直接乘法或浅拷贝会导致多个引用指向同一对象。

错误示例 1weird_board = [['_'] * 3] * 3 # 外层列表包含3个对同一内层列表的引用weird_board[1][2] = 'X' # 修改会影响所有行

输出

[['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]错误示例 2row = ['_'] * 3board = []for _ in range(3): board.append(row) # 每次追加的是同一个row对象board[1][2] = 'X' # 所有行同步修改

输出:同上。

3. 正确复制方法方法 1:循环中创建新对象board = []for _ in range(3): row = ['_'] * 3 # 每次循环创建独立的新列表 board.append(row)board[1][2] = 'X' # 仅修改指定位置

输出

[['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]方法 2:列表推导式board = [['_'] * 3 for _ in range(3)] # 每次迭代生成新列表board[1][2] = 'X'

输出:同上。

方法 3:copy 模块
  • copy.copy():浅拷贝(仅一层独立)。
  • copy.deepcopy():深拷贝(完全独立,包括嵌套对象)。
import copyoriginal = [[1, 2], [3, 4]]shallow_copy = copy.copy(original) # 浅拷贝:内层列表仍共享deep_copy = copy.deepcopy(original) # 深拷贝:完全独立4. 关键注意事项
  • 基本类型(如整数、字符串):乘法或浅拷贝安全,因它们不可变。
  • 可变对象(如列表、字典)

    乘法或浅拷贝会导致引用共享。

    需通过循环、列表推导或 deepcopy 确保独立性。

总结
  • 简单序列:直接用 * 或 [:] 复制。
  • 嵌套可变对象:使用循环、列表推导或 deepcopy 避免引用问题。
  • 验证独立性:通过修改副本并观察原对象是否变化来测试。