@zlodiak

Почему False аналогично 0?

Я делаю выборку из списка элементов, которые не равны 0 так:

#!/usr/bin/env python3

def move_zeros(array):
    others = [x for x in array if x != 0]
    print(others)   # [1, 1, 2, 1, 3, 'a']

print(move_zeros([False,1,0,1,2,0,1,3,"a"]))


В результате значение False не входит в конечную выборку. Скажите пожалуйста почему. Я ведь проверял каждый элемент списка на ноль, а на не False

UPD:
Вот так тоже не получается почему-то:
others = [x for x in array if isinstance(x, int) and x != 0]
  • Вопрос задан
  • 284 просмотра
Решения вопроса 1
ri_gilfanov
@ri_gilfanov
Web- and desktop-developer
Особенность реализации, булев тип (bool) наследуется от целочисленного (int).

Если требуется отличать False от 0 и True от 1 -- используйте оператор is вместо !=.

Операторы == и != проверяют равенство значений двух объектов. Но из-за особенностей реализации, у False и 0 -- одно и тоже значение, а у True и 1 -- одно и тоже другое значение.

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

is вернет True если две переменные указывают на один и тот же объект, == если объекты, на которые ссылаются переменные, равны.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы