Python 3.x 在python队列中添加新元素将所有以前的值更改为最新值(实现所有以前的StackOverflow答案)

Python 3.x 在python队列中添加新元素将所有以前的值更改为最新值(实现所有以前的StackOverflow答案),python-3.x,performance,knapsack-problem,branch-and-bound,Python 3.x,Performance,Knapsack Problem,Branch And Bound,链接中问题的简短版本-> 下面是解决此问题的简短代码片段 在python中使用Branch and Bound为0/1背包编码时,我使用了队列模块中的队列来存储所有节点 检查队列是否为空的代码段,然后根据代码获取值并将其推入队列 这里,q=queue.queue()用一个空节点u(-1,0,0)初始化。u2在开始时是一个空节点,用于在循环的每个迭代中存储节点 while not q.empty(): u = q.get() ............some cod

链接中问题的简短版本->

下面是解决此问题的简短代码片段 在python中使用Branch and Bound为0/1背包编码时,我使用了队列模块中的队列来存储所有节点

检查队列是否为空的代码段,然后根据代码获取值并将其推入队列

这里,
q=queue.queue()
用一个空节点u(-1,0,0)初始化。u2在开始时是一个空节点,用于在循环的每个迭代中存储节点

while not q.empty():
        u = q.get()
        ............some code ..........
        q.put(u2)
        display_queue(q)
        ..........some code..............
显示队列
定义为:

def display_queue(que):
  print("\nThe Nodes in queue currently: ")
  for item in list(que.queue):
    print("level:{}, profit:{}, weight:{}, bound:{}".format(item.level, item.profit, item.weight, item.bound))
  print()
问题是: 如果q最初包含[(0,0,35)]。添加(1,3,70)后,队列变为[(1,3,70),(1,3,70)]。注意:这些是随机值。请不要与输出上的数据混淆

输出示例:在经过适当的计算后,由于某种原因,假设队列正在增加

我已经阅读了stack overflow中相关问题的答案,如:但是我无法执行建议的更正。

当我尝试实现代码的一个微型版本时,我得到了所有正确的结果。也就是说,相同的东西(几乎)但不同的输出


看起来你把东西从队列中拿出来的速度和放进去的速度一样快

而不是q.empty():
u=q.get()#从队列中删除项
一些代码。。。。。。。。。。
q、 put(u2)#将项目添加到队列
显示队列(q)
一些代码。。。。。。。。。。。。。。
当您使用q.get()从队列访问数据时,您正在从队列中删除该项。为什么列表(que.queue)会给出一个包含三项的列表;我不确定。如果您希望您的项目是静态的,您可以使用列表列表

q_var=[]
q_变量追加([0,35,3,92])
q_变量追加([0,0,0,75])
q_var.append([1,45,5,75])
或者,如果我理解正确,您可以像在que.queue中一样访问队列,而无需通过不使用get()方法删除项目

count=0
而不是q.empty():
u=列表(q.队列)[计数]
一些代码。。。。。。。。。。
q、 put(u2)#将项目添加到队列
显示队列(q)
一些代码。。。。。。。。。。。。。。
计数+=1
这假定您已经向队列中添加了一些内容。无论哪种方式,问题都是get()方法,请参见

“Queue.get(block=True,timeout=None)”
从队列中删除并返回一个项目。“

看起来您将物品从队列中取出的速度与放入物品的速度一样快

而不是q.empty():
u=q.get()#从队列中删除项
一些代码。。。。。。。。。。
q、 put(u2)#将项目添加到队列
显示队列(q)
一些代码。。。。。。。。。。。。。。
当您使用q.get()从队列访问数据时,您正在从队列中删除该项。为什么列表(que.queue)会给出一个包含三项的列表;我不确定。如果您希望您的项目是静态的,您可以使用列表列表

q_var=[]
q_变量追加([0,35,3,92])
q_变量追加([0,0,0,75])
q_var.append([1,45,5,75])
或者,如果我理解正确,您可以像在que.queue中一样访问队列,而无需通过不使用get()方法删除项目

count=0
而不是q.empty():
u=列表(q.队列)[计数]
一些代码。。。。。。。。。。
q、 put(u2)#将项目添加到队列
显示队列(q)
一些代码。。。。。。。。。。。。。。
计数+=1
这假定您已经向队列中添加了一些内容。无论哪种方式,问题都是get()方法,请参见

“Queue.get(block=True,timeout=None)”
从队列中删除并返回一个项目。”

在问题的扩展部分添加了一个简短的可能答案,位于此问题的顶部。在问题的扩展部分添加了一个简短的可能答案,位于此问题的顶部。我意识到一个简单的列表实现很容易完成。但我的目的是学习python中的队列。我找到了一个对这个案例的修正,我已经在文章顶部的扩展链接中发布了这个修正。该方法正在使用get()本身。请参阅最新编辑(上次输出快照)以了解更多的混淆。get()方法将从队列中删除返回的项。我知道您在q.queue中得到了三个项目,但如果您阅读了文档,它不会列出queue.queue,因为最终用户不打算访问它。我不知道它为什么会这样,但如果您真的想了解如何使用队列,则需要阅读文档。在另一个站点上,您的简短实现没有使用get()方法。我意识到一个简单的列表实现很容易实现。但我的目的是学习python中的队列。我找到了一个对这个案例的修正,我已经在文章顶部的扩展链接中发布了这个修正。该方法正在使用get()本身。请参阅最新编辑(上次输出快照)以了解更多的混淆。get()方法将从队列中删除返回的项。我知道您在q.queue中得到了三个项目,但如果您阅读了文档,它不会列出queue.queue,因为最终用户不打算访问它。我不知道它为什么会这样,但如果您真的想了解如何使用队列,则需要阅读文档。在另一个站点上,您的简短实现不使用get()方法。