python的队列Queue中添加列表list作为元素要注意进行拷贝

目录

正文

昨晚写了一个在两个进程间使用队列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中插入列表元素时,注意使用拷贝。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python队列queue)可以通过入队(push)和出队(pop)操作来实现元素添加和删除。首先,我们需要创建一个队列对象,并初始化为空队列。然后,我们可以使用push方法将元素添加队列的末尾,使用pop方法从队列的头部删除元素。另外,我们还可以使用is_empty方法来判断队列是否为空,使用size方法来获取队列的长度。下面是一个示例代码: ```python class Queue(object): def __init__(self): self.list = [] def push(self, item): self.list.append(item) def pop(self): return self.list.pop(0) def is_empty(self): return self.list == [] def size(self): return len(self.list) s = Queue() print("入队前为空???:", s.is_empty()) s.push("西施") s.push("貂蝉") s.push("昭君") s.push("玉环") print('入队之后的长度:', s.size()) print(s.pop()) print('出队之后的长度:', s.size()) print("入队后为空???:", s.is_empty()) ``` 这段代码演示了如何使用自定义的Queue类实现队列的入队和出队操作。其,push方法用于将元素添加队列的末尾,pop方法用于从队列的头部删除元素。is_empty方法用于判断队列是否为空,size方法用于获取队列的长度。在这个示例,我们先将一些元素添加队列,然后逐个删除并打印出队的元素。 希望这个例子能够帮助你理解如何在Python使用队列进行入队和出队操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值