Identité et équivalence: is et == en Python

Il existe de nombreux langages qui ont ce concept, pas seulement Python. Prenons Python comme exemple.

"Même" et "même valeur"

Le mot «même» a deux significations. «Même» et «même valeur».

"M. A et M. B vivent dans la même maison."

Que voulez-vous dire? La plupart des gens penseront que MM. A et B vivent ensemble. En d'autres termes, M. A et M. B vivent dans la «même» maison.

"M. A et M. B portent les mêmes vêtements."

Que voulez-vous dire? Je pense que peu de gens pensent que M. A et M. B portent «les mêmes» vêtements, c'est-à-dire que deux personnes portent un seul vêtement. Il est naturel de penser que M. A et M. B portent respectivement des vêtements et que les vêtements que porte M. A et les vêtements que porte M. B sont, par exemple, des vêtements du même fabricant et du même dessin. est.

Peut-être que les choses elles-mêmes sont différentes, mais dans un certain sens, elles peuvent être appelées les mêmes. Ces relations sont appelées équivalence ou équivalence.

La mise en œuvre est nécessaire pour déterminer l'équivalence

Soit dit en passant, si ce n'est pas une chose simple comme un entier mais une chose compliquée comme des vêtements, vous devez penser à ce qui est considéré comme une «valeur égale». Si la taille des vêtements est également incluse dans la condition, si M. A et M. B ont des tailles différentes, peu importe leur similitude, ils ne seront pas considérés comme les mêmes. Si vous n'incluez pas la taille des vêtements dans l'état, si vous êtes commis à l'habillement et que le client dit "Parce que c'est un produit défectueux, remplacez-le par le même prix!", Vous pouvez apporter une taille différente. Peut être.

De plus, si vous l'écrivez, dans de nombreux cas, s'il est «identique», ce sera «valeur égale». Cependant, ce n'est pas toujours le cas, car cela dépend de ce qui est considéré comme «égal».

Pourquoi est-il nécessaire de faire la distinction entre la même valeur et la même valeur?

"M. A et M. B sont dans la même voiture. La voiture de M. A a percuté le mur."

M. B est-il en sécurité?

Si M. A et M. B étaient dans la même voiture, M. B ne serait pas en sécurité non plus. Même si M. A et M. B sont dans la même voiture (du même modèle), s'ils ne sont pas dans la même voiture, M. B n'a rien à voir avec cela.

"La variable a et la variable b pointent vers la même liste. J'ai supprimé un élément de la liste de la variable a."

L'élément a-t-il été supprimé de la liste des variables b?

Si la variable a et la variable b sont identiques, l'élément a également été supprimé de la liste de b. Même si la variable a et la variable b ont la même valeur, si elles ne sont pas identiques, la liste de b est conservée.

De cette manière, «même» et «valeur égale» sont des concepts similaires et différents, mais en général, la même valeur est utilisée plus souvent que la même valeur. La distinction entre identique et équivalent est souvent requise lorsque la comparaison porte sur un objet mutable tel qu'une liste. Dans un système de traitement comme Python qui alloue de la mémoire hors de la vue du programmeur, il est rarement nécessaire de se demander si des objets immuables pointent réellement vers le même objet. Par conséquent, est rarement utilisé pour les objets immuables.

Quels sont les opérateurs pour vérifier l'identité et l'équivalence en Python?

En Python, l'opérateur qui vérifie l'identité est est et l'opérateur qui vérifie l'égalité est ==. De plus, l'opérateur qui vérifie les valeurs non identiques ne l'est pas, et l'opérateur pour vérifier les valeurs non égales est! =.

== et! = Surcharge

Les opérateurs ==,! = Peuvent être surchargés par des noms de méthode spéciaux. (Autrement dit, vous pouvez définir comment comparer l'équivalence en créant une méthode avec un nom spécial.) Les opérateurs qui vérifient l'identité ne peuvent pas être surchargés.

En Python2, il existe deux types de noms de méthodes spéciales qui surchargent == (mais depuis Python 2.1). En Python3, l'un a été aboli et est devenu un type.

Les noms de méthodes spéciales qui peuvent être utilisés à la fois dans Python 2 (mais Python 2.1 ou supérieur) et 3 sont __eq__ (self, other) correspondant à == et __ne__ (self, other) correspondant à! =. .. Si vous souhaitez le créer à l'avenir, n'hésitez pas à l'utiliser si vous ne prévoyez pas de l'exécuter sur Python 2.1 ou une version antérieure.

Voici un exemple de code.

class Car:
    def __init__(self, maker, model, color, owner):
        self.maker = maker
        self.model = model
        self.color = color
        self.owner = owner
    def __eq__(self, other):
        try:
            if (self.maker == other.maker and self.model == other.model and
                   self.color == other.color):
                return True  #Même si les propriétaires sont différents, ils sont considérés comme la même voiture
        except AttributeError:
            pass
        return False
    def __ne__(self, other):
        return not self == other

my_car = Car("Nissan", "GT-R", "Red", "my name")
your_car = Car("Nissan", "GT-R", "Red", "your name")
his_car = Car("Nissan", "Note", "Blue", "his name")

my_garage = [my_car]

print(my_car == your_car) # ==> True
print(my_car == his_car) # ==> False
print(my_car is my_car) # ==> True
print(my_car is my_garage[0]) # ==> True
print(your_car is my_garage[0]) # ==> False
print(your_car == my_garage[0]) # ==> True

De plus, la méthode spéciale __cmp__ (self, other) qui ne peut être utilisée qu'en Python2 est un opérateur qui définit six opérateurs <, <=, == ,! =,> =,> À la fois, et__cmp__ (self Si, autre) ʻest négatif, cela signifie <, s'il vaut 0, cela signifie ==, et s'il est positif, cela signifie>. Je ne le recommande pas du tout car il ne peut pas être utilisé dans 3, mais il semble que int soit implémenté danscmp` même dans la série Python 2.7, donc je vais l'introduire juste au cas où.

C'est une jambe de serpent. Avec la nouvelle méthode, pour implémenter la comparaison de magnitude, vous devez définir __ne__, __lt__, __le__, __ge__, __gt__ en plus de __eq__, mais Python 2.7 Dans les versions suivantes et 3, en utilisant functools.total_ordering, __eq ___ et __lt__, __le__ Si vous définissez l'un de, __ge__, __gt__, le reste sera fait pour vous.

Autre

Est-il possible que les classes intégrées Python soient les mêmes mais pas les mêmes?

Le type à virgule flottante nan (pas un nombre) n'est pas la même valeur par comparaison. Par conséquent, même si vous le comparez avec vous-même, ce ne sera pas la même valeur.

nan = float("nan")
print(nan is nan)  # ==> True
print(nan == nan)  # ==> False

J'ai entendu dire que vous devriez utiliser is au lieu de == lorsque vous comparez à None. Pourquoi?

Si ==, comme mentionné ci-dessus, l'utilisateur peut l'implémenter comme il le souhaite, donc dans certains cas, des exceptions telles que TypeError et AttributeError peuvent apparaître, True peut être retourné même si ce n'est pas None, et le traitement peut être lourd. Hmm. Cependant, si vous comparez avec is, vous pouvez certainement comparer si la valeur est None ou non. Cependant, c'est parce qu'il est [garanti par les spécifications du langage] qu'il n'y a qu'un seul objet avec la valeur None (http://docs.python.jp/2/reference/datamodel.html#types). Tu peux le faire. Cette utilisation est source de problèmes lorsqu'il peut y avoir plusieurs objets avec la même valeur.

Est ou ==, qui est plus rapide?

Fondamentalement, c'est plus rapide. Cependant, il existe peu de situations où vous pouvez utiliser l'un ou l'autre.

En comparant les ints avec is, ils sont devenus les mêmes. Est-il correct de comparer int avec is?

La même valeur peut être identique ou non. Utilisez == pour comparer les entiers, sauf si vous souhaitez vérifier l'identité dans un but particulier.

En comparant les strs avec is, ils sont identiques. Est-il correct de comparer str?

Comme ci-dessus.

Est-ce que c'est comme JavaScript ===, n'est-ce pas?

faux. Puisque === en JavaScript est un opérateur qui vérifie si les valeurs sont les mêmes sans conversion de type, nous vérifions si elles sont identiques. Python vérifie qu'il est le même. Pour faire quelque chose de similaire en Python, considérez, par exemple, type (a) est type (b) et a == b.

Recommended Posts

Identité et équivalence: is et == en Python
Différence entre == et est en python
Différences d'identité, d'équivalence et d'alias
Python est facile
Qu'est-ce que python
Python est une instance
Comment utiliser is et == en Python
Qu'est-ce que Python
Qu'est-ce que la «programmation fonctionnelle» et «orientée objet»? Édition Python
La réponse de "1/2" est différente entre python2 et 3
À propos de la différence entre "==" et "is" en python
Que comparez-vous avec Python et ==?
Matrice unitaire et matrice inverse: Algèbre linéaire en Python <4>
[python] Compresser et décompresser
python int est infini
Astuces Python et Numpy
[Python] pip et roue
[Python] Qu'est-ce que Pipeline ...
Itérateur et générateur Python
Paquets et modules Python
Intégration Vue-Cli et Python
Ruby, Python et carte
entrée et sortie python
Python et Ruby se séparent
Métaclasse et isinstance
Python # Vérifier l'identité du type
Python asyncio et ContextVar
[Python] Qu'est-ce que virtualenv
Le comportement de retrait de json.dumps est différent entre python2 et python3
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Le rond de Python n'est pas strictement rond
[Python] Débogage plus efficace!
Python: variables de classe et d'instance
3-3, chaîne Python et code de caractère
Série Python 2 et série 3 (édition Anaconda)
Python et matériel - Utilisation de RS232C avec Python -
Python sur Ruby et Ruby en colère sur Python
Indentation Python et format de chaîne
division des nombres réels python (/) et division des nombres entiers (//)
Installez Python et Flask (Windows 10)
Comment utiliser __dict__ en Python
À propos des objets et des classes Python
À propos des variables et des objets Python
Apache mod_auth_tkt et Python AuthTkt
Python est douloureux. Mais utilisez
Apprenez à connaître les packages et les modules Python
# 2 [python3] Séparation et commentaire
Copie superficielle Python et copie profonde
Python est un langage pour adultes
Mémo tranche python et rubis
Installation de Python et grammaire de base
J'ai comparé Java et Python!
Copie superficielle Python et copie profonde
Jugement d'équivalence d'objet en Python
La liste Python n'est pas une liste
À propos de Python, len () et randint ()
La série Python 3.4 est sûre pour installer et exécuter Python Kivy (macOS)