Python中Klotski类BFS求解报错:'list'无'is_objective'属性
华容道BFS求解的AttributeError排查与修复
错误核心原因
is_objective是你定义的华容道棋盘类的实例方法/属性,但代码中某环节误将**普通列表(list)**当作棋盘类实例来访问该属性,导致触发AttributeError。
常见出错场景及修复方案
1. BFS队列混入列表而非棋盘实例
初始化或入队时,错误地将棋盘的二维网格列表(比如board.grid)放入队列,而非棋盘类的实例。
# 错误写法 from collections import deque queue = deque([initial_board_grid]) # initial_board_grid是列表 # 正确写法 queue = deque([initial_board_instance]) # initial_board_instance是你的棋盘类实例
2. 状态生成返回列表而非新棋盘实例
生成下一步可移动状态时,直接返回修改后的二维列表,未封装成棋盘类实例。
# 错误写法 def generate_next_states(self): new_grid = [row.copy() for row in self.grid] # 执行移动逻辑修改new_grid return [new_grid] # 返回列表 # 正确写法(假设你的棋盘类名为KlotskiBoard) def generate_next_states(self): next_states = [] for move in self.get_possible_moves(): new_grid = [row.copy() for row in self.grid] self._apply_move_to_grid(new_grid, move) next_board = KlotskiBoard(new_grid) next_states.append(next_board) return next_states
3. 误将网格属性当作实例使用
在BFS循环中,错误地取出队列中的列表并尝试访问is_objective。
# 错误写法 current_state = queue.popleft() if current_state.is_objective: # current_state是list,触发报错 # 正确写法 current_state = queue.popleft() if current_state.is_objective: # current_state是棋盘类实例
验证建议
在BFS循环中添加类型检查,确认当前处理的对象类型:
current_state = queue.popleft() print(type(current_state)) # 应输出你的棋盘类,而非<class 'list'>
内容的提问来源于stack exchange,提问作者NightFox
相关产品推荐
相关产品推荐

