Почему в питоне нельзя приравнять(по смыслу): '0' == 48?
Ведь по кодировке ASCII это одно и тоже.
Просто в C же можно, а почему тут не действует?
2 Answers
В Си '0' имеет тип int. В Питоне '0' имеет тип str. Строки не равны числам в Питоне. Питон — сильно-типизированный язык. str не превращается неявно в int.
Для сравнения приведите к одному типу:
>>> ord('0') == 48
True
>>> '0' == chr(48)
True
ord() возвращает порядковый номер Unicode символа (Unicode code point) как целое число.
chr() в обратную сторону работает: возвращает Unicode символ по его номеру.
Номера Unicode символов в ASCII диапазоне совпадают со значениями байтов, полученных кодированием этих символов, используя ASCII кодировку.
Байты (тип bytes) в Питоне (3) это коллекция чисел в диапазоне 0 <= b < 256. Байты в ASCII диапазоне, можно с помощью соответствующих символов в исходном коде задавать:
>>> b'0'[0] == 48
True
В Питоне, гарантировано 48 здесь получите (вне зависимости от кодировки исходного кода). В сторону: в общем случае Си не обязан ASCII кодировку использовать, поэтому '0' не обязан быть равным 48.
- 52,361
Тут не действует, потому что:
1) в Python обычные строки не ASCII, а UNICODE
2) главное это разные типы для сравнения которых надо делать явное приведение.
Дополнительная новость - в Python нет матриц и массивов в понимании Фортрана или С. Однако есть специальные модули, в которых похожие массивы реализованы.
- 4,090
-
1- str тип представлял последовательности байт в Питоне 2 (не обязан ascii кодировку использовать). str представляет последовательности Unicode символов в Питоне 3 (их внутреннее представление может быть разным -- деталь реализации). Другими словами ASCII и Unicode к совершенно разным категориям в Питоне относятся (всё равно что килограммы с метрами сравнивать). 2- в общем случае, объекты разных типов могут быть равны в Питоне. К примеру:
1 == 1.0(сравнение происходит без приведения типа, подробнее: Ляп в Питоне: x + 1.0 < x) – jfs Nov 30 '17 at 09:33
ord, переводящая символ в Unicode/ASCII число, иchr, переводящая Unicode/ASCII число в символ – andreymal Nov 27 '17 at 16:54