Python for循环生成矩阵存入列表后所有值相同问题求解
问题核心原因
- numpy数组是可变对象,你在循环外初始化的
gen_res是固定内存地址的数组,每次循环只是修改这个地址上存储的数值,调用append()往列表里添加的是同一个内存地址的引用,没有存实际的数值快照。因此当最后一次循环修改完gen_res的值后,列表里所有指向这个地址的元素都会同步显示最后一次的结果。 - 额外注意你原代码的缩进存在问题,
append语句的缩进要和内层的for i循环对齐,否则会出现逻辑错误。
两种修复方法
方法1:每次循环创建新数组
把gen_res的初始化逻辑移到p循环内部,每次循环生成独立的新数组,从根源上避免引用复用,修改后代码如下:
import numpy planning_time = 3 gen_resfinal = [] for p in range(planning_time): gen_res = numpy.zeros([30,4]) for i in range(30): for j in range(4): gen_res[i,j] = value(m.gen[i,j]) gen_resfinal.append(gen_res)
方法2:添加时做数组拷贝
如果要保留循环外的gen_res定义,就在每次append时对当前数组做深拷贝,把当前的数值快照存入列表:
import numpy planning_time = 3 gen_res = numpy.zeros([30,4]) gen_resfinal = [] for p in range(planning_time): for i in range(30): for j in range(4): gen_res[i,j] = value(m.gen[i,j]) gen_resfinal.append(gen_res.copy())
内容的提问来源于stack exchange,提问作者pythonbeginner
相关产品推荐
相关产品推荐

