2023-12-16 10:42:36
在 Python 中,复制序列可以通过多种方式实现,但需要注意不同方法对元素引用的处理差异。以下是具体方法和注意事项:
1. 基本复制方法序列乘法复制适用于简单序列(如数字、字符串)。
不修改原序列,返回新对象。
适用于列表、字符串等可切片对象。
同样不修改原序列。
当列表元素为可变对象(如嵌套列表)时,直接乘法或浅拷贝会导致多个引用指向同一对象。
错误示例 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 模块乘法或浅拷贝会导致引用共享。
需通过循环、列表推导或 deepcopy 确保独立性。