#python #float
Есть такой код: a = float("nan") a == a # Получаем False [a] == [a] # Получаем True Почему так происходит?
Ответы
Ответ 1
Потому что в первом случае работает свойство NaN. А во втором случае Python проверяет на равенство массивы, а не объекты a. В данном случае [a] == [a] - объекты внутри массивов одни и те же (один и тот же экземпляр класса), а следовательно Python будет реагировать на a как на обычные объекты (сначала сравнивать по ссылкам).Ответ 2
Здесь есть некоторая несогласованность. С одной стороны, в CPython, nan != nan возвращает значение, которое Си на данной системе возвращает для nan — float_richcompare(): Python x == y delivers the same result as the platform C x == y when x and/or y is a NaN. что означает IEEE 754 поведение как правило: NaN не равен даже самому себе. С другой стороны, сравнение элементов списков, использует сравнение, которое сперва проверяет ссылаются ли параметры на один и тот же объект, не вызывая операцию равенства (a==b) для случая a is b— PyObject_RichCompareBool(): Quick result when objects are the same. Guarantees that identity implies equality. Поэтому [nan] == [nan] (так как nan is nan), не смотря на то, что nan != nan. Формально, Питон (вне зависимости от реализации) гарантирует, что x == x ложно для x = float('NaN'), но внутри коллекции такой как список x == x всегда считается истинно: the comparison of collections assumes that for a collection element x, x == x is always true.
Комментариев нет:
Отправить комментарий