В Python3 это выражение оценивается как False:
b"" == ""
в то время как в Python2 это сравнение True:
u"" == ""
Проверка идентичности с is, очевидно, не может в обоих случаях.
Но почему они реализуют такое поведение в Python3?
В Python3 это выражение оценивается как False:
b"" == ""
в то время как в Python2 это сравнение True:
u"" == ""
Проверка идентичности с is, очевидно, не может в обоих случаях.
Но почему они реализуют такое поведение в Python3?
В Python 2.x целью проектирования для юникода является включение прозрачных операций между строк Unicode и байтов путем неявного преобразования двух типов. Когда вы выполняете сравнение u"" == "", unicode Юникода автоматически кодируется в байтовую строку сначала, а затем сравнивается с str RHS. Вот почему он вернул True.
Напротив, Python 3.x, узнав из беспорядка юникода, который был в Python 2, решил сделать все, что явствует из строк unicode vs. byte. Таким образом, b"" == "" является False потому что строка байта больше не будет автоматически преобразована в unicode для сравнения.
В питоне 3 строка - это Юникод. Тип, используемый для хранения текста, это str а тип для хранения данных - bytes.
типы
strи bytes не могут быть смешаны, вы всегда должны явно конвертировать между ними. Используйтеstr.encode()для перехода отbytes.decode()к байту иbytes.decode()для перехода от байта к строке.
Поэтому, если вы выполните b"".decode() == "" вы получите True:
>>> b"".decode() == ""
True
Для получения дополнительной информации читайте текст Vs. Данные вместо Unicode Vs. 8-би
Дизайнеры решили не предполагать кодирование для принуждения при сравнении байтов со строками, поэтому оно подпадает под поведение Python 3.x по умолчанию, в результате чего сбрасываются сравнения, содержащие разные типы.