Python嵌套for循环莫名中断,执行计数不符问题求助
循环计数异常原因分析
问题场景
运行以下Python代码时,循环计数变量i的输出结果为42598:
import numpy as np all_sets = [] working_sets = [] numbers = np.arange(10) operators = ['+', '-', '*', '/'] i = 0 expression = ['', '', '', '', '', '', ''] for n1 in numbers: expression[0] = str(n1) for o1 in operators: expression[1] = o1 for n2 in numbers: expression[2] = str(n2) for o2 in operators: expression[3] = o2 for n3 in numbers: expression[4] = str(n3) for o3 in operators: expression[5] = o3 for n4 in numbers: expression[6] = str(n4) i += 1 # get all sets for comparison numbers = sorted([expression[0], expression[2], expression[4], expression[6]]) if not (numbers in all_sets): all_sets.append(numbers) print(i)
但注释掉以下代码段后:
# get all sets for comparison numbers = sorted([expression[0], expression[2], expression[4], expression[6]]) if not (numbers in all_sets): all_sets.append(numbers)
i的输出结果变为640000。请问是什么原因导致循环提前中断?
核心原因
问题出在循环内部重写了外层循环依赖的numbers变量:
- 一开始
numbers是numpy.arange(10)生成的数组[0,1,2,...,9],是外层多个for循环的迭代对象。 - 当执行到
numbers = sorted([expression[0], expression[2], expression[4], expression[6]])时,numbers被替换成了一个仅包含4个字符串元素的列表(比如第一次循环后会变成['0','0','0','0'])。 - 后续的
for循环(比如for n3 in numbers、for n4 in numbers)会迭代这个新的短列表,而不是原来的10元素数组,直接导致循环次数大幅减少,最终i的计数远低于预期值。
举个直观的例子:原本for n3 in numbers要循环10次,现在因为numbers被改成了长度为4的列表,只循环4次;同理for n4 in numbers也从10次变成4次,整个嵌套循环的总次数急剧下降,所以i的结果变成了42598。
而注释掉那段代码后,numbers始终保持最初的10元素数组,所有嵌套循环都按预期执行:10(n1)×4(o1)×10(n2)×4(o2)×10(n3)×4(o3)×10(n4)= 640000,和输出结果完全一致。
内容的提问来源于stack exchange,提问作者Akut Luna
相关产品推荐
相关产品推荐

