Python BFS算法异常:队列弹出整数引发TypeError错误
问题原因与解决办法
核心问题
你遇到的TypeError本质是队列里混入了非坐标元组的整数元素,第二次弹出的是单个整数1,自然无法用下标(比如current[0])访问。只有起点终点同为(0,0)时正常,是因为这种情况不需要遍历任何邻居,队列只进了起点就直接处理完了,不会触发错误。
大概率出错的地方
90%以上是你在生成邻居坐标、往队列里加元素的时候,误把单个坐标值(比如x或y)当成元组塞进去了。比如本来应该把(nx, ny)入队,结果写成了queue.append(nx)或者queue.append(ny)。
解决步骤
- 全面检查所有入队操作:找到代码里所有
queue.append(...)的地方,确保每一次传入的都是长度为2的元组(比如(x, y)),而不是单个整数。 - 排查邻居生成逻辑:比如你计算新坐标
nx = x + dx[i]、ny = y + dy[i]之后,是不是正确把这两个值打包成元组再入队?举个正确写法的例子:dx = [0, 0, 1, -1] dy = [1, -1, 0, 0] current = queue.popleft() x, y = current for i in range(4): nx = x + dx[i] ny = y + dy[i] # 检查nx、ny是否在网格范围内,以及是否未访问过 if 0 <= nx < rows and 0 <= ny < cols and not visited[nx][ny]: visited[nx][ny] = True queue.append((nx, ny)) # 这里必须是元组,不能单独写nx或ny - 快速定位错误点(可选):可以在入队前加个简单的校验,比如:
用这个函数替代直接def enqueue(queue, pos): assert isinstance(pos, tuple) and len(pos) == 2, "入队元素必须是坐标元组" queue.append(pos)append,一旦传入错误类型会立刻抛出断言错误,帮你精准找到哪一行写错了。
内容的提问来源于stack exchange,提问作者kisaievla
相关产品推荐
相关产品推荐

