A set
функционирует почти так же, как dict
, с hash
вашего объекта в качестве ключа. По умолчанию функция __hash__
большинства объектов (в CPython) основана на их id
, что, в свою очередь, зависит от их адреса в памяти.
Новое ядро означает, что объекты имеют другой адрес, что означает другой id
, другой hash
и другой порядок итератора, который дает набор.
Это реализация -зависимый, так что вы не можете полагаться на это, все, что я могу сказать, это CPython, до сих пор работает таким образом. На что вы можете положиться - это set
, который (бесполезно) не упорядочен.
Если вам нужно упорядочить, сохраните и список, и набор. Если вы хотите удалить повторы при сохранении порядка, сработает что-то вроде этого:
def could_add(s, x):
if x in s:
return False
else:
s.add(x)
return True
seen = set()
[x for x in l if could_add(seen, x)]
(Хотя я полностью согласен с комментарием Бармара - если порядок имеет значение, они должны сортироваться.)