You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改类中的列表时不影响外部传入的原始列表

问题根源

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:15:04