Упомянутые вами операции набора:
^
- симметрия c разница (XOR):
Вернуть новый набор с элементами либо в наборе, либо в другом, но не в обоих.
Пример: {'1', '2', '3'} ^ {'2', '3', '4'} = {'1', '4'}
|
- union (OR):
Возвращает новый набор с элементами из набора и всеми другими.
Пример: {'1', '2', '3'} | {'2', '3', '4'} = {'1', '2', '3', '4'}
В python также есть другие операции над множествами:
&
- пересечение (AND):
Вернуть новый набор с элементами, общими для набора и всех остальных.
Пример: {'1', '2', '3'} & {'2', '3', '4'} = {'2', '3'}
-
- разница :
Возвращает новый набор с элементами в наборе, которых нет в других.
Пример: {'1', '2', '3'} - {'2', '3', '4'} = {'1'}
Порядок приоритета для этих операций -, &, ^, |
, поэтому в вашем примере мы сначала применяем ^
:
>>> y^z
{'a', 'c', 'e', 'f', 'g', 'h', 'i'}
А затем |
:
>>> x|{'a', 'c', 'e', 'f', 'g', 'h', 'i'}
{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'}
Различные описываемые вами выходы на самом деле совпадают, поскольку наборы не упорядочены.
>>> {'c', 'h', 'f', 'd', 'b', 'i', 'g', 'a', 'e'} == {'a', 'd', 'h', 'f', 'b', 'g', 'e', 'c', 'i'}
True
Любой порядок, показанный в строковом представлении набора, является деталью реализации и на него не следует полагаться, так как он будет непредсказуемым, как вы обнаружили.