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
相关产品推荐
相关产品推荐

