7
votes

Comment Python évalue-t-il "est" les expressions?

Un comportement erratique de "est" expressions en python.

>>> 258 -1 == 257
True


4 commentaires

>>> 2-1 est 1 renvoie true lol


@carlosdc n'est pas exactement un duplicata. Depuis cela fonctionne pour d'autres chiffres. C'est pourquoi j'ai demandé.


@Rahul rendez cela clair dans votre question.


Comme Ashwini a souligné. Cette question: Stackoverflow.com/Questtions/11476190/Why-0-6-IS-6 -false est plus proche de la mienne.


4 Réponses :


2
votes

est compare l'identité d'objet et les rendements true uniquement si les deux côtés sont le même objet. Pour des raisons de performances, Python maintient un "cache" de petits entiers et les réutilise, de sorte que tous les objets int (1) sont le même objet. Dans CPPHON, les entiers mis en cache vont de -5 à 255, mais il s'agit d'un détail de mise en œuvre, vous ne devez donc pas compter sur elle. Si vous souhaitez comparer l'égalité, utilisez == , pas est .


1 commentaires

Vous pouvez également obtenir ce genre de chose qui se passe avec des chaînes lorsque les littéraux à chaîne sont mis en cache jusqu'à une certaine taille. Et des choses comme foo = "foo"; foo est foo.strip () peut retourner vrai aussi.



1
votes

le python est opérateur chèques Pour Identité d'objet , pas de valeur d'objet. Les deux entiers doivent se référer à l'objet même réel en interne pour le retour.

Cela reviendra vrais pour les "petits" entiers dues à un cache interne maintenu par Python, mais deux numéros avec la même valeur ne retourneront pas vrai si par rapport à est en général.


0 commentaires

6
votes

est est utilisé pour la vérification de l'identité, pour vérifier si les deux variables pointent sur le même objet, tandis que == est utilisé pour vérifier les valeurs.

à partir du DOCS :

Les opérateurs sont et ne sont pas test pour l'identité d'objet: x is y est true Si et seulement si x et y sont le même objet. x n'est pas y donne le Valeur de vérité inverse. xxx

mais de petits entiers (-5 à 256) et de petites chaînes sont mis en cache par Python: pourquoi (0-6) est -6 = faux? xxx


0 commentaires

2
votes

Le est vérifie l'option d'objet: L'objet créé en appelant 258-1 n'est pas le même objet que celui créé par 257 . L'opérateur == si les valeurs des objets comparés sont les mêmes.

Essayez d'utiliser Aide ('is') .


3 commentaires

Alors pourquoi 2-1 est-ce que 1 retourne vrai?


@Rahul Python cache quelques petits entiers et petites chaînes, voir: Stackoverflow.com/questions/11476190 / why-0-6-is-6-faux


Répondu ici: Stackoverflow.com/a/16615952/2237320