En Python3, cette expression est évaluée comme False
:
b"" == ""
alors qu'en Python2 cette comparaison est True
:
u"" == ""
La vérification de l'identité avec is
échoue évidemment dans les deux cas.
Mais pourquoi implémenteraient-ils un tel comportement en Python3?
Dans Python 2.x, l'objectif de conception pour unicode est d'activer des opérations transparentes entre les chaînes unicode et octet en convertissant implicitement entre les 2 types. Lorsque vous effectuez la comparaison u"" == ""
, le unicode
LHS est d'abord automatiquement codé dans une chaîne d'octets, puis comparé au str
RHS. C'est pourquoi il a renvoyé True
.
En revanche, Python 3.x, ayant appris du désordre d'unicode qui se trouvait dans Python 2, a décidé de tout rendre explicite sur les chaînes unicode vs octets explicites) . Donc, b"" == ""
est False
car la chaîne d'octets n'est plus automatiquement convertie en unicode pour comparaison.
Dans python 3 est Unicode. Le type utilisé pour contenir le texte est str
et le type utilisé pour contenir les données est bytes
.
les types
str
et octets ne peuvent pas être mélangés, vous devez toujours convertir explicitement entre eux. Utilisezstr.encode()
pour passer de str à octets etbytes.decode()
pour passer d'octets à str.
Par conséquent, si vous faites b"".decode() == ""
vous obtiendrez True
:
>>> b"".decode() == ""
True
Pour plus d'informations, lisez Texte vs données au lieu de Unicode vs 8-bi
Les concepteurs ont décidé de ne pas supposer un codage pour la coercition lors de la comparaison des octets aux chaînes, il tombe donc sous le comportement par défaut de Python 3.x où les comparaisons contenant des types différents échouent.