Почему False аналогично 0?
Особенность реализации, булев тип (bool) наследуется от целочисленного (int).
Если требуется отличать False от 0 и True от 1 -- используйте оператор is вместо !=.
Операторы == и != проверяют равенство значений двух объектов. Но из-за особенностей реализации, у False и 0 -- одно и тоже значение, а у True и 1 -- одно и тоже другое значение.
Оператор is проверяет равенство id двух объектов. Булевы объекты True и False -- это синглтоны, т.е. существуют в программе не более, чем в 1 экземпляре. Поэтому, у всех True -- один и тот же id, а у всех Fasle -- один и тот же другой id.
if not x is 0print(0 == False) # True
print(0 is False) # Falseis вернет True если две переменные указывают на один и тот же объект, == если объекты, на которые ссылаются переменные, равны.