Вы путаете изменчивость с заказанным или нет. Наборы являются изменяемыми, но неупорядоченными (порядок не имеет значения).
Ответ на этот вопрос не имеет ничего общего с dict
реализацией __eq__
(которую ==
вызывает), поскольку он делегирован Реализация типов значений __eq__
.
Проще говоря, если v1 == v2
, то {'a': v1} == {'a': v2}
.
[1, 2] != [2, 1]
, поэтому {'a': [1, 2]} != {'a': [2, 1}
.
Аналогично, {1, 2} == {2, 1}
так {'a': {1, 2} == {'a': {2, 1}}
.
Я не проверял C реализацию dict.__eq__
, но это, вероятно, эквивалентно (возможно, с некоторыми более причудливыми оптимизациями):
if len(d1) != len(d2):
# dicts don't have same # of keys, can't be equal
return False
for k1, v1 in d1.items():
try:
v2 = d2[k1]
except KeyError:
# d2 does not have a key that d1 has, can't be equal
return False
# delegating the check to the value's type implementation of ==
if v1 != v2:
# d1 and d2 have the same key but the value is different, can't be equal
return False
# all keys and values in d1 and d2 are equal, so dicts are equal
return True