Почему Python TypeError: нехешируемый тип: ‘список’

#python

#python

Вопрос:

Может кто-нибудь, пожалуйста, скажите мне, почему я получаю ошибку TypeError: unhashable type: ‘list’ в инструкции print ниже? По какой-то причине ему не нравится список данных, которые я ввожу в функцию.

 from random import randint
from functools import lru_cache


data = []

[data.append(randint(1,1000000)) for i in range(1,1000000)]

data = sorted(data)

low = 0
high = len(data)   1


target = randint(1,100000)

print(low, high, target)

@lru_cache(maxsize = 1000)
def binary_search(data, target, low, high):
    if low > high:
        return False
    
    else:
        mid = (low   high) // 2
        if target == data[mid]:
            return True
        elif target < data[mid]:
            return binary_search(data, target, low, mid 1)
        else:
            return binary_search(data, target, mid 1, high)

print(binary_search(data, target, low, high))
 

Комментарии:

1. Не похоже, что эта ошибка может возникнуть из любого оператора печати. Не могли бы вы, пожалуйста, опубликовать всю информацию об ошибках и трассировке стека, которую вы получаете?

2. Обычно эта ошибка возникает, когда вы пытаетесь получить доступ к словарю, используя список в качестве ключа, вы можете использовать кортеж для ее решения

Ответ №1:

lru_cache требуется, чтобы аргументы были хешируемыми:

 In [1]: from functools import lru_cache                                                                                                                                                                                                                                                  

In [2]: @lru_cache(maxsize=1000) 
   ...: def f(arg): 
   ...:     print(arg) 
   ...:                                                                                                                                                                                                                                                                                  

In [3]: f([1,2,3])                                                                                                                                                                                                                                                                       
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-816cce84b257> in <module>
----> 1 f([1,2,3])

TypeError: unhashable type: 'list'
 

Это связано с тем, что реализация использует некоторую хэш-таблицу для эффективного поиска аргументов. list s изменчивы и, следовательно, не могут быть хэшированы.

Если вы хотите использовать lru_cache аргументы, они должны быть, например, tuple s вместо list s .

В вашем случае:

 print(binary_search(tuple(data), target, low, high))
 

должно работать.

Комментарии:

1. Да! Это сработало. Большое спасибо, Бакуриу.