You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:55:32