Python分块赋值时while循环未按预期终止(无限循环)问题
无限循环问题修复方案
你的代码存在几个关键问题,导致blocks_A[28]永远无法填满,陷入无限循环:
- 循环内变量被反复重置:每次进入
while len(blocks_A[28]) < 12循环时,z、w、x都会被重新赋值为0、11、0,相当于每次都在重复处理sorted_resistances的前11个元素,完全不会往后推进。 - 切片范围错误:Python的切片是左闭右开的,
sorted_resistances[z:w]当w=11时,只会取到索引0到10的11个元素,永远凑不够12个,导致if len(blocks_A[x]) == 12永远不成立,x、z、w根本不会更新。 - 排序时机不合理:每次读取一行就排序一次,既浪费性能又没必要,应该等所有数据读取完成后统一排序。
- 存在冗余代码:
blocks_B的定义和后续逻辑完全无关,属于无效代码。
修复后的代码
# 直接创建包含29个空列表的blocks_A,替代繁琐的while循环初始化 blocks_A = [[] for _ in range(29)] with open("file.txt") as file_in: list_of_resistances = [] for line in file_in: list_of_resistances.append(int(line)) # 所有数据读取完成后再统一排序 sorted_resistances = sorted(list_of_resistances) current_block = 0 # 依次填充每个block,直到填满29个 while current_block < 29: # 按照需求:每个block取12个元素,中间跳过12个,所以起始索引是current_block * 24 start_idx = current_block * 24 end_idx = start_idx + 12 # 把对应范围的元素添加到当前block blocks_A[current_block].extend(sorted_resistances[start_idx:end_idx]) # 如果不需要再排序(原列表已经是有序的,子列表自然有序),可以删掉下面这行 blocks_A[current_block].sort() current_block += 1 print(blocks_A)
关键修复点说明
- 初始化优化:用
[[] for _ in range(29)]直接生成29个空列表,比原代码的while循环简洁高效。 - 变量持久化:
current_block在循环外初始化,每次循环后递增,确保能依次处理每个block,不会重置。 - 正确的元素选取逻辑:
start_idx = current_block * 24完美匹配“前12个给A[0],跳过12个,取接下来12个给A[1]”的需求,start_idx:end_idx正好取12个元素。 - 性能优化:仅排序一次,避免重复排序的开销。
- 清理冗余代码:移除了无用的
blocks_B相关代码。
内容的提问来源于stack exchange,提问作者Joao
相关产品推荐
相关产品推荐

