正文
昨晚写了一个在两个进程间使用队列Queue实现数据交换的程序,结果发现插入的数据(列表list)在另外一个进程取出时莫名其妙地变成了空列表[ ],反复调试后才发现:要对插入队列的列表类型元素进行深拷贝,以免后续对列表做操作会影响队已进入队列的列表。
用以下例子进行解释:
from queue import Queue
q = Queue()
a = [1, 2, 3]
q.put(a)
a.clear()
print("q.get()=", q.get())
输出:
q.get()= []
从该例子可以看出,将列表a插入队列q以后,对a进行清空,结果导致从队列中取出元素时得到了一个空列表。
如果改成以下方式,在队列中插入a的拷贝,即可解决这个问题。
from queue import Queue
q = Queue()
a = [1, 2, 3]
q.put(a.copy())
a.clear()
print("q.get()=", q.get())
输出:
q.get()= [1, 2, 3]
总结
向队列中插入的列表只是一个列表的地址,里面包含的内容还是会被队列外的语句改动。这是因为列表属于可变类型,列表的内容改变了,但地址不变。因此,要注意在向队列Queue中插入列表元素时,注意使用拷贝。