2012-10-01 31 views
1

我想显示在一个GUI列表框的一些信息。我在我的MVC的仅模型部分写了一个测试方法,它输出我想要的信息;但是,当我将该代码转移到完整的GUI时,它会引发错误。PYTHON - Unhashable名单

这里有两段代码:

型号:(注意,此方法针对一类Products()书面)

def test(self): 
    for key in self._items_list: 
     print self.get_item(key) #this refers to the get_item function of the Products class: 

def get_item(self, key): 
    return self._items_list[key] # items_list is a dictionary 

所以,这个返回输出我想放在我的列表框中。

这里是我的代码传输到我的GUI(这是一类我定义它从Control继承):

def refreshData(self): 
    for keys in self._productslist: #this productslist is equivalent to items_list 
     disp = self._products.get_item(keys) #so i can call the method from the Product class 
     self.insert(END, dips) 

这引发了我下面的错误,当我尝试打开并显示文件:

...in get_item 
return self._items_list[key] 
TypeError: unhashable type: 'list' 

对不起,这是漫长的,可能非常混乱,但本质上我想知道为什么我得到的错误代码的完整版本的方法,而不是在孤立的模型。

所有相关的代码是相同的,据我所知。

任何想法将不胜感激!

+0

列表不能用作成套字典或值键,因为它们不支持哈希 - 这是一个设计决策,Python已经执行(大概是因为列表是可变的,这可能会导致危险的意外)。 – 2012-10-01 00:26:47

+0

(检查什么'key'计算 - 它可能不会如预期那样 - 那么*为错误信息搜索*和两件事情联系在一起:-) – 2012-10-01 00:28:03

+0

但为什么难道不存在处于孤立的模型,代码中的错误?那是什么让我感到困惑! 另外,“list”是一个我称为self._items_list的字典,所以我调用存储在[key]中的字典的值。是吗? – chris

回答

1

你不能哈希表,只有一成不变的东西。虽然你可以定义为list对象的一些扩展__hash__方法,这种逻辑背后的原因是,如果你要查找东西在一本字典,你期望中的条目的名字没有改变。同样,在Python中,键必须是不可变的。如另一个答案所述,请改用tuple