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
相关产品推荐
相关产品推荐

