【问题标题】:When and Why the occurrence of the TypeError: unhashable type: 'list'? [duplicate]何时以及为什么会出现 TypeError: unhashable type: 'list'? [复制]
【发布时间】:2020-04-07 18:31:06
【问题描述】:

我的源代码如下,它是 Python 脚本语言:

d = [frozenset({[[1]*2, (2, 3)*3]*4}), {5, }, {6: '', 9: " "}]
print(d, sep = '\t')
for k in d:
    print(k, type(k), sep = '\t')

我的输出信息如下:

"C:\Program Files\Python37\python.exe" E:/Observations/LISTS/basics.py
Traceback (most recent call last):
  File "E:/Observations/LISTS/basics.py", line 144, in <module>
    d = [frozenset({[[1]*2, (2, 3)*3]*4}), {5, }, {6: '', 9: " "}]
TypeError: unhashable type: 'list'

Process finished with exit code 1

【问题讨论】:

  • 您试图将一个可变列表对象放入一个集合中,这是您无法做到的。你想做什么?
  • 但是,根据python内置的数据结构特性,每个数据结构都可能包含任何其他数据结构,我的目的是观察哪个数据结构包含所有其他数据结构,包括那个,并注意它们作为复合数据结构出现的顺序。
  • 这不是真的。我不确定你是从哪里听到的。一般来说,可变对象不能是集合或字典的键,或者在任何其他需要对结构进行散列的上下文中。

标签: python list dictionary typeerror


【解决方案1】:

这是因为字典中的列表是一个无法散列的列表。这可以通过将内部嵌套列表转换为这样的元组来解决,

d = [frozenset({((1)*2, (2, 3)*3)*4}), {5, }, {6: '', 9: " "}]

【讨论】:

  • 我得到了我期望的输出,但唯一的变化是它被元组替换而不是列表。正如您在回答中所描述的, list 是字典对象的成员,请!再次观察我的代码。字典是列表中的成员。根据我在问题中发布的代码,你说的反之亦然。所以,请给我一些澄清。谢谢你先生.....
  • 谢谢你,先生,现在我得到了澄清......
  • 在您的代码中,您有最外部的列表,即 [frozenset(...), ..., ...] 。在frozenset 部分中,您有一个包含列表的字典。即 {[[1]*2, (2, 3)*3]*4} 。因此,您的字典中有列表,当您尝试创建该字典的冻结集(包含列表)时,它会引发无法对列表进行哈希处理的错误。背后的原因是只有不可变的东西可以被散列。该列表是可变的,因此无法对其进行散列处理并引发错误。如果您觉得我的回答有用,请投票支持我的回答。谢谢
  • 在此回复之前我已得到澄清,先生。谢谢您,先生,刚才我投票赞成您的回答。
猜你喜欢
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2019-10-11
  • 2020-03-27
  • 2020-05-11
  • 1970-01-01
相关资源
最近更新 更多