如何修改Python中Queue队列内部存储的列表的元素值
问题原因
你的代码没有生效主要有两个核心问题:
- 初始化队列时,你四次
put的都是同一个列表对象lists,四个队列元素指向同一块内存地址,就算修改生效,四个列表的内容也会完全一致,不可能出现你想要的分段递增效果。 - 遍历修改列表元素时,
for elem in lst拿到的是元素值的临时副本,直接给elem赋值只会修改临时变量,不会改动原列表的内容,必须通过索引赋值才能修改原列表的元素。
解决方法
方法1:直接操作内部队列(单线程场景可用)
首先修正队列初始化逻辑,每次放入新的独立列表,再通过索引遍历修改元素:
import queue # 初始化队列,每次放入独立列表 data = queue.Queue(maxsize=4) for i in range(4): data.put([None]*3) # 原地修改元素 x = 1 for lst in data.queue: for idx in range(len(lst)): lst[idx] = x x += 1 print(data.queue) # 输出:deque([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
注意:data.queue是queue.Queue的内部非公开属性,仅适合单线程场景下使用,多线程场景下推荐使用方法2。
方法2:通过公开接口操作(兼容多线程,更稳妥)
通过Queue公开的get、put方法操作元素,修改完后重新放回队列,避免直接操作内部属性:
import queue data = queue.Queue(maxsize=4) for i in range(4): data.put([None]*3) x = 1 temp = [] # 取出所有元素修改 while not data.empty(): lst = data.get() for idx in range(len(lst)): lst[idx] = x x += 1 temp.append(lst) # 将修改后的元素放回队列 for lst in temp: data.put(lst) print(data.queue)
内容的提问来源于stack exchange,提问作者anti4r
相关产品推荐
相关产品推荐

