Eh bien, je pense que le fait qu'ils ne soient pas les mêmes est assez répandu, Alors __ je voudrais expliquer à quoi diable comparez-vous __.
Il semble qu'il y ait toujours des erreurs dans l'article, donc je serais heureux si vous pouviez le signaler (je serais heureux s'il y avait des commentaires)
Je vais vous expliquer brièvement (si vous le comprenez, vous pouvez le sauter) Regardez d'abord l'exemple 1
Exemple 1
a = "Maison de lapin"
b = "Maison de lapin" #Même chaîne qu'un
c = "Kantoan" #Chaîne de caractères différente d'un
#a et c==Comparer avec
print(a == c) # False
#Comparez a et c avec is
print(a is c) # False
#a et b==Comparer avec
print(a == b) # True
#Comparez a et b avec is
print(a is b) # False
Puisque "Rabbit House" et "Kantoan" sont naturellement différents, "a == c" et "a est c" sont tous deux "faux".
D'un autre côté, «a» et «b» se ressemblent à première vue ...
True
quand ʻa == b
False quand ʻa est b
Le résultat est différent
Eh bien le sujet principal
Je vais expliquer en me basant sur l'exemple 2.
Exemple 2
a = "Maison de lapin"
b = "Maison de lapin" #Même chaîne qu'un
# ==Comparer avec
print(a == b) # True
#Comparer avec est
print(a is b) # False
print(id(a)) #ID d'objet d'un
print(id(b)) #ID d'objet de b(Renvoie une valeur qui n'est pas la même qu'un)
En Python, toutes les données sont un objet. ʻId () `est une fonction qui renvoie l'identifiant de l'objet argument (ci-après dénommé l'identifiant de l'objet).
==
a renvoyé True
car ʻa et
b étaient __la même chaîne __. Cependant, ʻa est b
retourné False
, même s'il s'agissait de la même chaîne.
C'est parce que ʻis` est un opérateur __ qui compare les identifiants d'objets __.
Vérifie si «==» est __equivalent __. D'autre part, ʻis` vérifie s'il s'agit de __ident __.
La différence est ici
--L'identifiant de l'objet renvoyé par la fonction id () devient l'adresse de la mémoire dans laquelle réside l'objet lorsqu'il est multiplié par hex (). --Il existe des cas d'exception (voir ci-dessous)
Il suffit de comprendre le contenu ci-dessus, mais il existe des cas d'exception, je vais donc le présenter pour le moment.
Exemple 3
a = 100
b = 100
print(a == b) #Est-ce équivalent
print(a is b) #Est-ce la même
Sera-ce vrai ou faux?
Ceux qui comprennent jusqu'ici sont probablement
Vous vous attendez à ce que ʻa == b renvoie
True et ʻa is b
renvoie False
.
Mais __ les deux sont Vrai
... __
*** Ces opérateurs de comparaison devraient être généralisés, mais il y a des exceptions et ils sont fous. *** ***
Je penserais. Je le pensais au début (´ ・ ω ・ `)
Cependant, il y a une bonne raison à cela. De Objets entiers simples - Documentation Python 2.7.13 --PyObject * PyInt_FromLong
The current implementation keeps an array of integer objects for all integers between -5 and 256
Expliquer en japonais
L'implémentation actuelle de Python contient un tableau d'objets entiers de -5 à 256
Il y a. En d'autres termes, Python garde toujours en mémoire les tableaux de -5 à 256.
a = b = range(-6, 258) #-Générer un tableau de 6 à 257
for x,y zip(a, b):
print(x, x is y) #Comparer si deux valeurs équivalentes sont identiques
-6 False
-5 True
-4 True
.
.
(Omission)
.
.
255 True
256 True
257 False
Vous avez renvoyé «True» entre -5 et 256 car les identifiants d'objet sont les mêmes. D'autre part, il renvoie «False» pour -6 et 257 (première et dernière valeurs) qui sont hors de la plage de valeurs détenues par la mémoire.
C'est déroutant, mais vous devez vous en souvenir aussi.
Autre Une comparaison entre «True» et «False» retournera toujours «True». En effet, il n'y a toujours qu'un seul "Vrai" et "Faux" en mémoire.
Il y a une autre exception pour autant que je sache, mais je vais l'omettre ici.
Si vous avez des suggestions, laissez-les dans la section commentaires!
Recommended Posts