Error messages can be frustrating and confusing. For example, you might get a “TypeError:
unhashable type” error message when you try to import a Python module. It’s not always clear
how to fix these errors, especially given the variety of ways that an error like this can happen.
This article will help you troubleshoot and solve the problem!
I’ll start by explaining what we mean by “unhashable.” Then we’ll take a look at why “TypeError:
unhashable type” might pop up when importing modules in Python. Next, I’ll give some tips on
how to find and fix those “TypeError: unhashable type” errors. We’ll also take a look at the interactive debugging features in the Idle IDE.
What’s Unhashable?
The word “unhashable” comes from computer science terminology. It refers to something that
cannot be used as a key in a hash table. You might have used hash tables to find or store
something with a unique identifier, like your cell phone number, an ISBN number, or some other
reference number. A hash table uses one of these keys to find and retrieve its value (that is, whatever you stored).
Key differences between hash tables and Python dictionaries
One key difference between a dictionary and a hash table is that a dictionary can’t hold only one
value. A dictionary can hold multiple values, which is useful for something like your friends’
phone numbers. But if you want to make sure that the same person’s phone number will always
be returned, you don’t want to store this multiple-value information in a dictionary. That way, if
your friend changes his or her number, it won’t be reflected in the phone numbers stored in your
friends’ phones! Rather than using multiple values to represent an identifier, you could use one
big integer . (This is what’s called a “key” and is used to look up the value of something like your
phone number.) A hash table works pretty much the same way. Instead of using multiple values
to represent an identifier, you use one value that nobody else uses, and then store that value in
a hash table as a key. For example, it’s possible for some user to assign different identifiers
(keys) to each of his or her friends’ phones so that every time anyone calls, the phone number on the caller ID is their friend’s phone number.
Here’s an analogy. Remember when you were in school? You might have gone to a school with
iffy computer security. You probably remember the “secret codes” that you needed to use to
access the computers. To login, for example, you needed to enter your computer access code.
And in order to download files, you needed to enter the download access code so that only
authorized people could use computers or download files undetected by their teachers or fellow students.
Imagine that one time, when I went into the lab at school, my teacher told me not to touch any of
the computers because they were being fixed by tech support. He then proceeded to unlock the door and turn the key into the lock! I couldn’t believe it.
The next day, I went into the lab and my teacher pointed out that everything was still unlocked.
Because of his careless mistake, any student could use any computer or download any files
without entering a code. This is like what we mean by “unhashable” — you can’t use something as a key and expect to retrieve what you stored with that key.
Python Hashable and Unhashable Types
You can’t use a type as a key in a hash table. But you can use the same type in two different
ways: You can find it , like when you run: print ( 1 ) and see that value’s value. Or you can
change it, which is what happens when you run: 1 = 2 . When you change the value of a
variable or an object, that’s sometimes called assigning or reassigning the variable. In Python, this is called “unhashing” the object.
But why would you want to “unhash” something? For example, imagine that you have an object (usually called obj ) like this: unhashable type list
obj = [] # creates an empty list
And suppose that you want to make obj into a list of integers. You could do this:
obj = [] # creates an empty list 1 , 2 , 3 for i in obj : print ( i ) # prints 1, 2, and 3 assigned to our
‘obj’ variable. But if we wanted to print out the numbers that 1 , 2 , 3 represent, we need to use the “unhashable” type. You can do this like this:
x = 1 , 2 , 3 # x will contain the list of integers. Now, if we want to iterate through the values in