Why set.discard doesn't throw an error when a set is passed to it in Python?

Question:

My question is quite simple.

When I run

someSet = {1,2,3,4}
someSet.discard([5])

It gives the error:

Traceback (most recent call last):
  File "File.py", line 2, in <module>
    someSet.discard([5])
TypeError: unhashable type: 'list'

Just like list, sets are also unhashable and can’t be stored in a set.
So, I expect the following code to generate an error:

someSet = {1,2,3,4}
someSet.discard({5})

But to my surprise, it did not generate any error. Why is it so? Does this mean that I am getting an error for list as there something other than it being unhashable which gives rise to the error? If yes, then what is that thing?

Asked By: user12137152

||

Answers:

There’s a weird special case where if you pass another set to set.remove, set.discard, or x in set, the set is silently converted to a frozenset.

Note, the elem argument to the __contains__(), remove(), and discard() methods may be a set. To support searching for an equivalent frozenset, a temporary one is created from elem.

Answered By: user2357112
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.