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

Python中如何复制Chromosome类的二维matrix列表值而非引用?

二维列表深拷贝解决方案

你遇到的问题根源在于matrix是二维列表,切片、list()转换、copy()都属于浅拷贝——它们只复制了外层列表的容器结构,里面的每个子列表依然是原列表的引用,所以修改新列表的子元素时还是会影响原数据。要实现真正的值复制,需要做深拷贝,这里有几种可行的方法:

方法1:列表推导式手动深拷贝

通过遍历外层列表,对每个子列表单独做拷贝,生成完全独立的二维列表:

matrix1 = [row.copy() for row in self.chromosomes[index].matrix]
matrix2 = [row.copy() for row in self.chromosomes[index + 1].matrix]

方法2:使用copy模块的deepcopy

Python标准库的copy模块提供了专门的深拷贝函数,能处理任意嵌套深度的结构:
先导入模块:

import copy

再在crossover方法中使用:

matrix1 = copy.deepcopy(self.chromosomes[index].matrix)
matrix2 = copy.deepcopy(self.chromosomes[index + 1].matrix)

方法3:在Chromosome类中封装复制逻辑(更优雅)

给Chromosome类添加一个方法,专门返回自身matrix的深拷贝,让代码更清晰易维护:

class Chromosome:
    def __init__(self):
        self.matrix = [[0 for x in range(LENGTH)] for y in range(LENGTH)]
    
    def get_matrix_copy(self):
        # 用列表推导式实现深拷贝
        return [row.copy() for row in self.matrix]
        # 也可以用deepcopy:return copy.deepcopy(self.matrix)

之后在Population的crossover方法中直接调用:

matrix1 = self.chromosomes[index].get_matrix_copy()
matrix2 = self.chromosomes[index + 1].get_matrix_copy()

替换后,你就可以安全修改新的matrix1和matrix2,不会影响原Chromosome实例的matrix数据了。

内容的提问来源于stack exchange,提问作者Hakan SONMEZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:42:06