При переборе словаря внутри словаря модифицируется более одного ключа, несмотря на оператор break - PullRequest
1 голос
/ 01 декабря 2011

Я обнаружил эту очень странную ошибку, которую не могу понять.

Прежде всего, внутри этой функции я открою:

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", если count == выбранный элемент.

Я попытался также щелкнуть третий элемент списка (с индексом 2), и это то, что я получил отprint count и print 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" и таквкл.

Я не помечал этот вопрос с помощью графического интерфейса пользователя, потому что я исключил вероятность того, что проблема существует, насколько мне известно.


РЕДАКТИРОВАТЬ:

Так как проблема, кажется, когда я использую рассол, вот более соответствующий код:

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)

addFood is

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)

И мариновать я делаю:

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"))

1 Ответ

1 голос
/ 01 декабря 2011

Проблема в объекте, который вы травите, конечно, оба объекта одинаковы, например,

>>> 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'}]
...