如何修改类中的列表时不影响外部传入的原始列表
问题根源
Python中的列表属于可变对象,你在类的__init__方法中直接将传入的puzzle赋值给self.puzzle时,本质是让两个变量指向内存中同一个嵌套列表对象,因此修改任意一个引用指向的内容,都会同步影响另一个。
解决方案
只要在类初始化时,为实例单独生成一份完全独立的嵌套列表拷贝即可,有两种常用实现方式:
- 方式1:使用Python标准库
copy模块的deepcopy方法,适配任意层级的嵌套结构 - 方式2:针对你当前的两层嵌套列表,手动逐行切片复制,无需额外导入依赖
修改后可直接运行的代码
from pprint import pprint import copy # 导入深拷贝依赖 num_matrix = [ [0, 0, 9, 4, 0, 7, 0, 0, 1], [0, 0, 0, 0, 3, 0, 0, 7, 0], [4, 0, 0, 0, 8, 0, 0, 0, 0], [5, 0, 0, 1, 0, 4, 0, 2, 0], [0, 0, 3, 0, 0, 0, 5, 0, 0], [0, 0, 0, 8, 0, 0, 0, 0, 0], [3, 0, 0, 5, 0, 2, 0, 1, 0], [0, 0, 0, 0, 7, 0, 0, 0, 0], [0, 6, 0, 0, 0, 0, 0, 0, 9]] class hi(): def __init__(self, puzzle): # 方式1:深拷贝,适配任意嵌套层级 self.puzzle = copy.deepcopy(puzzle) # 方式2:手动两层拷贝,无需导包,当前场景也可生效 # self.puzzle = [row[:] for row in puzzle] def replace(self): self.puzzle[0][0] = 11 mat1 = hi(num_matrix) mat1.replace() pprint(num_matrix) pprint(mat1.puzzle)
运行上述代码即可得到你期望的输出:原num_matrix保持不变,仅实例内的puzzle内容被修改。
补充说明
如果你的后续开发中会出现三层及以上的嵌套结构,优先使用deepcopy更稳妥,手动拷贝仅适配固定层级的嵌套列表。
内容的提问来源于stack exchange,提问作者Risal Shahid
相关产品推荐
相关产品推荐

