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

Python中map创建Queue列表程序冻结,列表推导正常的原因?

问题:两种Queue列表创建方式导致程序行为差异的原因

我在写程序解决Advent of Code挑战时,遇到一个奇怪的问题:

  • 用stacks = list(map(Queue, range(num_of_stacks)))创建Queue列表,程序迭代时直接冻结;
  • 换成列表推导stacks = [Queue() for i in range(num_of_stacks)]则运行正常。
    调试时两种方式返回的对象看起来一致,但向Queue存入数据时表现完全不同。

相关代码:

num_of_stacks = int((len(config[0]) + 1)/4)
stacks = [Queue() for i in range(num_of_stacks)]
# stacks = list(map(Queue, range(num_of_stacks)))
print(stacks)
for line in config[len(config)-2::-1]:
    print(stacks)
    for i in range(0, len(line), 4):
        print(int(i/4), line[i+1: i+2])
        if line[i+1: i+2] != ' ':
            print(stacks[int(i/4)])
            stacks[int(i/4)].put(line[i+1: i+2])
    print(line)

输入示例:

[M]     [W] [M]    
            [L] [Q] [S] [C] [R]    
            [Q] [F] [F] [T] [N] [S]
    [N]     [V] [V] [H] [L] [J] [D]
    [D] [D] [W] [P] [G] [R] [D] [F]
[T] [T] [M] [G] [G] [Q] [N] [W] [L]
[Z] [H] [F] [J] [D] [Z] [S] [H] [Q]
[B] [V] [B] [T] [W] [V] [Z] [Z] [M]
 1   2   3   4   5   6   7   8   9 
原因解释

核心差异在于两种方式调用Queue构造函数的参数不同:

  • list(map(Queue, range(num_of_stacks)))中,map会把range(num_of_stacks)里的每个整数(0,1,2,...)作为参数传给Queue,相当于创建了Queue(0)、Queue(1)、Queue(2)...这些实例。
  • queue.Queue的第一个参数是maxsize,用来限制队列的最大容量:
    • 当maxsize=0(默认值),队列可无限扩容;
    • 当maxsize>0,队列满了之后调用put()时,默认会阻塞当前线程,直到队列有空闲位置。

你的代码需要往每个队列中存入多个元素,比如第二个队列对应Queue(1),当存入第二个元素时队列就满了,put()会一直阻塞,导致程序“冻结”。

而列表推导[Queue() for i in range(num_of_stacks)]是每次调用Queue()时不传参数,使用默认的maxsize=0,所有队列都能无限接收元素,不会触发阻塞逻辑,因此运行正常。

内容的提问来源于stack exchange,提问作者VarMoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:12