gpt4 book ai didi

python - 在字典内迭代字典时,尽管有break语句,但不止一个键被修改

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:19 24 4
gpt4 key购买 nike

我发现了这个非常奇怪的错误,我无法理解。

首先,我在这个函数中解封:

tableOrders = pickle.load(open("\\\\VIERNES7-3\Documentos c\sharedTableOrders.p","rb"))

如果我这样做pprint(tableOrders)我得到:

{1: {'blink': False,
'canceled': 'no',
'orders': [{u'availability': u'si',
u'canceled': u'no',
u'category': u'Minutas',
u'kitchen': u'si',
u'name': u'Hamburguesa al Plato',
u'parilla': u'no',
u'price': 60,
u'ready': u'no'},
{u'availability': u'si',
u'canceled': u'no',
u'category': u'Minutas',
u'kitchen': u'si',
u'name': u'Hamburguesa al Plato',
u'parilla': u'no',
u'price': 60,
u'ready': u'no'}]}}

现在我以这种方式迭代思想表顺​​序:

count = 0
for x in tableOrders[table]["orders"]:
if (x["kitchen"] == "si" or x["category"] == "Bebidas") and x["ready"] == "no":
print count
print int(event.widget.curselection()[0])
if count == int(event.widget.curselection()[0]):
x["ready"] = "si"
event.widget.delete(int(event.widget.curselection()[0]))
break
count += 1

int(event.widget.curselection()[0]) 将是列表框的选定元素(似乎工作正常)。

奇怪的是,在我这样做之后:

{1: {'blink': False,
'canceled': 'no',
'orders': [{u'availability': u'si',
u'canceled': u'no',
u'category': u'Minutas',
u'kitchen': u'si',
u'name': u'Hamburguesa al Plato',
u'parilla': u'no',
u'price': 60,
u'ready': u'si'}, <-------------- MARKED AS "si"
{u'availability': u'si',
u'canceled': u'no',
u'category': u'Minutas',
u'kitchen': u'si',
u'name': u'Hamburguesa al Plato',
u'parilla': u'no',
u'price': 60,
u'ready': u'si'}]}} <-------------- MARKED AS "si"

因此,两个“ready”都被标记为“si”,这不是我所期望的,因为我在那里放置了一个中断,并且只有当计数==所选元素时,它才应该更改属性“ready”。

我还尝试单击列表框的第三个元素(索引为 2),这是我从 print countprint int(event.widget.curselection( )[0]):

0
2
1
2
2
2

这就是为什么我感到困惑,因为只有当两者相等(2 == 2)时,x["ready"] = "si" 代码才应该执行。

我不确定问题出在哪里,我很迷茫,但也许我对循环或中断的理解不正确,或者我对如何处理字典和 x["ready"] = "si 感到困惑“ 做了一些超出我预期的事情。

以防万一,如果我单击列表框的第一个元素(因此 int(event.widget.curselection()[0]) 为零),我想要列表的第一个元素为 x["ready"] == "si",如果我单击第二个元素,列表的第二个元素的值应为“ready”到“si”,依此类推。

我没有用 gui 标记这个问题,因为据我所知,我已经放弃了该问题存在的可能性。

<小时/>

编辑:

因为问题似乎是当我使用 pickle 时,这里是更相关的代码:

l = []
for item in sorted(jMenu["menu"]["items"]):
if item["category"] == selectedCategory:
l.append(item)
pedido = l[int(widget.curselection()[0])]

##pedido is something like this:
##pedido = {u'category': u'Bebidas', u'price': 40, u'name': u'Coca Cola', u'availability': u'si'}

然后我这样做:

tableOrders.addFood(activeTable, pedido)

添加食物是

def addFood(self, table, food):
if not table in self.tableList.keys():
self.tableList[table] = {"orders":[food], "blink": False, "canceled": "no"}#el canceled hay que sacarlo?
else:
self.tableList[table]["orders"].append(food)

我做的 pickle :

def dumpTableOrders(self):
tableOrders = pickle.load(open("sharedTableOrders.p","rb"))
#pprint(self.tableList)

for food in sorted(self.tableList[activeTable]["orders"]):
if not activeTable in tableOrders.keys():
tableOrders[activeTable] = {"orders":[food], "blink": False, "canceled": "no"}#el canceled hay que sacarlo?
else:
tableOrders[activeTable]["orders"].append(food)

self.tableList = {}
#pprint(tableOrders)
pickle.dump(tableOrders, open(r'sharedTableOrders.p',"wb"))

最佳答案

问题出在您正在 pickle 的对象中,当然这两个对象是相同的,例如

>>> import pickle
>>> d = {'name':'same'}
>>> ds = pickle.dumps([d,d])
>>> newd = pickle.loads(ds)
>>> newd[0]['name'] = 'different'
>>> newd
[{'name': 'different'}, {'name': 'different'}]

因此,请查看您正在选择的对象并在那里创建副本,替代方法是 json 转储它,这样您就不会再次获得相同的对象,例如

>>> import json
>>> ds = json.dumps([d,d])
>>> newd = json.loads(ds)
>>> newd[0]['name'] = 'different'
>>> newd
[{u'name': 'different'}, {u'name': u'same'}]

关于python - 在字典内迭代字典时,尽管有break语句,但不止一个键被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8333512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com