Как работает бинарный оператор & в python?
Этот оператор может быть перегружен, а потому имеет разную семантику для разных типов данных.
Для множеств этот оператор возвращает их пересечение.
Ты можешь добавить поддержку этого оператора в свой класс, объявив магический метод __and__().
Важно понять, что фигурные скобки - литерал множества. Вы сделали два множества и провели операцию & для двух множеств. Результат - множество, содержащее совпавшие элементы из обоих множеств.
В случае, когда вы сделали «число» И «число», у чисел в python способ логического И описан несколько по-другому, и результат другой. 

В общем, вы можете сделать свой тип (класс) множеств, для которого переопределить эту и другие операции как вам хочется. По-умолчанию - так.