Вы пытаетесь использовать dict
в качестве ключа к другому dict
или в set
. Это не работает, потому что ключи должны быть хешируемыми. Как правило, только неизменяемые объекты (строки, целые числа, float, frozensets, кортежи неизменяемых) являются хешируемыми (хотя возможны исключения). Так что это не сработает:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Чтобы использовать dict в качестве ключа, вам нужно превратить его во что-то, что может быть хэшировано первым. Если dict, который вы хотите использовать как ключ, состоит только из неизменяемых значений, вы можете создать его хешируемое представление следующим образом:
>>> key = frozenset(dict_key.items())
Теперь вы можете использовать key
в качестве ключа в dict
или set
:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Конечно, вам нужно повторять упражнение всякий раз, когда вы хотите что-то искать с помощью dict:
>>> some_dict[dict_key] # Doesn't work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> some_dict[frozenset(dict_key.items())] # Works
True
Если dict
вы хотите использовать в качестве ключа значения, которые сами являются dicts и / или списками, вам необходимо рекурсивно «заморозить» предполагаемый ключ. Вот отправная точка:
def freeze(d):
if isinstance(d, dict):
return frozenset((key, freeze(value)) for key, value in d.items())
elif isinstance(d, list):
return tuple(freeze(value) for value in d)
return d
Foo foo2();
изменить на
Foo foo2;
Вы получите ошибку, потому что компилятор считает
Foo foo2()
объявлением функции с именем 'foo2' и типом возвращаемого значения 'Foo'.
Но в этом случае Если мы изменим значение на Foo foo2
, компилятор может показать ошибку «вызов перегруженного 'Foo ()' неоднозначен»
.