实例化deque后弹出元素触发TypeError的原因排查
岛屿数量问题中deque初始化引发TypeError的原因
在解决「岛屿数量」问题时,使用collections.deque((r,c))初始化双端队列后,执行q.popleft()并尝试解包会触发如下报错:
TypeError: cannot unpack non-iterable int object
r_curr, c_curr = q.popleft()
但先初始化空deque再调用q.append((r,c))的写法却能正常运行。以下是两种写法的代码对比:
报错代码
def bfs(r,c): q = collections.deque((r,c)) while q: r_curr, c_curr = q.popleft() for dr, dc in dirs: r_next, c_next = r_curr + dr, c_curr + dc if is_valid(r_next, c_next): visited.add((r_next, c_next)) q.append((r_next, c_next))
正常代码
def bfs(r,c): q = collections.deque() q.append((r,c)) while q: r_curr, c_curr = q.popleft() for dr, dc in dirs: r_next, c_next = r_curr + dr, c_curr + dc if is_valid(r_next, c_next): visited.add((r_next, c_next)) q.append((r_next, c_next))
核心差异分析
deque初始化的参数处理逻辑
- 当使用
collections.deque((r,c))时,传入的(r,c)是一个可迭代元组,deque会遍历元组的每个元素并逐个加入队列。假设r=0、c=1,队列初始状态为deque([0, 1])。此时q.popleft()取出的是单个整数0,无法解包为两个变量,直接触发TypeError。 - 而使用空deque加
q.append((r,c))时,是把完整的元组(r,c)作为一个独立元素加入队列。同样假设r=0、c=1,队列初始状态为deque([(0, 1)])。q.popleft()取出的是整个元组,自然可以正常解包为r_curr和c_curr两个变量。
补充:正确的初始化写法
如果你想直接用初始化的方式创建包含元组元素的队列,需要把元组放在一个可迭代容器(比如列表)里,例如:
q = collections.deque([(r,c)])
这样deque会把列表里的元组作为单个元素加入队列,效果和先初始化空队列再append一致。
内容的提问来源于stack exchange,提问作者sollyc123
相关产品推荐
相关产品推荐

