循环中途异常添加多元素:HIGH/LOW需为NS*PARTS规模求助
问题分析与解决方案
你的问题核心在于HIGH和LOW的修改逻辑被错误地嵌套在了处理CONS的内层循环(i循环)中,而HIGH/LOW的维度是NS×PARTS,和NM无关,这就导致当CONS的子列表已经满足长度要求时,HIGH/LOW会被重复检查并意外追加元素。
具体问题点
看你的代码结构:
if (self.PARTS>oldnrofPARTS): for j in range(self.NS): for i in range(self.NM): # 内层循环处理CONS[j][i] while(len(self.CONS[j][i])<self.PARTS): self.CONS[j][i].append(True) # 错误:HIGH/LOW的修改放在了i循环内 while(len(self.HIGH[j])<self.PARTS): self.HIGH[j].append(high) self.LOW[j].append(high)
对于j=2和j=3,它们的CONS[j][i]初始长度已经等于PARTS=3,所以内层的CONS while循环不会执行。但HIGH[j]初始长度是2,第一次i循环时会追加一次(长度变为3),如果后续i循环中因为某些意外情况(比如列表引用共享、变量值被误修改)导致HIGH[j]长度再次小于PARTS,就会触发第二次追加,最终导致长度超标。
修正代码
把HIGH/LOW的修改逻辑移到i循环的外面,因为每个j对应的HIGH/LOW只需要调整一次,和NM的数量无关:
#-------------------- 根据新值修改连接 ---------------------- print ('PARTS: ' + str(self.PARTS)) print ('oldnrofPARTS: ' + str(oldnrofPARTS)) print ('NS: ' + str(self.NS)) print ('NM: ' + str(self.NM)) print ('CONS: ' + str(self.CONS)) print ('HIGH: ' + str(self.HIGH)) print ('LOW: ' + str(self.LOW)) high = '0'.zfill(int(self.AW/4)) self.AW = 32 if (self.PARTS>oldnrofPARTS): for j in range(self.NS): # 先处理所有CONS[j][i]的元素追加 for i in range(self.NM): while(len(self.CONS[j][i])<self.PARTS): self.CONS[j][i].append(True) # 再单独处理当前j对应的HIGH和LOW,仅执行一次 while(len(self.HIGH[j])<self.PARTS): self.HIGH[j].append(high) self.LOW[j].append(high) print('line 87 HIGH: ' + str(self.HIGH)) elif (oldnrofPARTS>self.PARTS): for j in range(self.NS): # 先处理所有CONS[j][m]的元素移除 for m in range(self.NM): while(len(self.CONS[j][m])>self.PARTS): self.CONS[j][m].pop(self.PARTS) # 再单独处理当前j对应的HIGH和LOW,仅执行一次 while(len(self.HIGH[j])>self.PARTS): self.HIGH[j].pop(self.PARTS) self.LOW[j].pop(self.PARTS) print('line 97 HIGH: ' + str(self.HIGH)) print ('PARTS: ' + str(self.PARTS)) print ('oldnrofPARTS: ' + str(oldnrofPARTS)) print ('NS: ' + str(self.NS)) print ('NM: ' + str(self.NM)) print ('CONS: ' + str(self.CONS)) print ('HIGH: ' + str(self.HIGH)) print ('LOW: ' + str(self.LOW))
修正逻辑说明
- CONS的处理:因为CONS是三维结构
NS×NM×PARTS,所以需要遍历每个j和i,调整每个CONS[j][i]的长度到PARTS。 - HIGH/LOW的处理:它们是二维结构
NS×PARTS,每个j对应的列表只需要调整一次,不需要在内层循环中重复检查,这样就能彻底避免意外的多次追加/删除。
额外检查点
如果修正后仍然存在问题,建议检查你的初始化代码,确保self.HIGH和self.LOW的每个子列表都是独立的对象(比如不要用[['00000000']*2]*4这种方式初始化,会导致所有子列表共享引用,修改一个会影响全部)。
内容的提问来源于stack exchange,提问作者AuroraS
相关产品推荐
相关产品推荐

