Python中遍历类对象列表的for循环仅执行一次就停止的问题
问题原因及修复方案
核心问题:循环内提前触发return直接终止函数
你的循环只执行一次就停止,本质是第一次循环迭代时就执行了return语句,直接退出整个函数,后续列表元素完全没机会进入循环处理。
看代码里的关键问题点:
- 处理垂直墙的逻辑中,只要进入
if y_positions[0] < y_intersect < y_positions[1]分支,不管内部条件是否满足,都会执行return True或return False; - 就算不进入该分支,后续紧跟的
return False也会直接终止函数; wall.ISHORIZONTAL的分支永远不会被执行,因为前面的return已经让函数提前退出了。
附带语法错误
除了提前return的问题,代码还有两处语法错误:
- 创建列表不能用
list(a, b),正确写法是[a, b]或list((a, b)); list.sort()是原地排序方法,返回值为None,所以y_positions = [a, b].sort()会让y_positions变成None,后续访问y_positions[0]会触发报错。应该用sorted([a, b])返回新的排序后列表。
修复后的代码示例
调整逻辑:找到符合条件的墙时立即返回True,遍历完所有墙都没找到才返回False:
# print(self.APPLICATION.WALLS) output: 4 for wall in self.APPLICATION.WALLS: if wall.ISVERTICALE: x_intersect = wall.START_X_POSITION y_intersect = (amplitude * x_intersect) + height # 用sorted返回排序后的新列表,避免原地排序返回None y_positions = sorted([wall.START_Y_POSITION, wall.END_Y_POSITION]) if y_positions[0] < y_intersect < y_positions[1]: # 同样用sorted处理x相关的排序 x_sorted = sorted([x_position, x_intersect, self.x_position]) if x_sorted[1] == x_intersect: return True # 调整缩进,确保水平墙分支能被执行到 elif wall.ISHORIZONTAL: y_intersect = wall.START_Y_POSITION x_intersect = (y_intersect - height) / amplitude # 此处需补充水平墙的判断逻辑,原代码直接return False不合理,根据需求完善 # 示例:if 满足某条件: # return True # 遍历完所有墙都无匹配,才返回False return False
关键调整说明
- 移除循环内部的
return False,仅在找到匹配项时返回True; - 遍历完所有元素后,统一返回
False; - 用
sorted()替代list.sort(),避免变量被赋值为None; - 调整水平墙分支的缩进,确保代码能被执行到;
- 补充水平墙的判断逻辑(原代码直接return不符合业务逻辑,需根据实际需求完善)。
内容的提问来源于stack exchange,提问作者J3hud
相关产品推荐
相关产品推荐

