Quelle est la différence entre «is None» et «== None»


324

J'ai récemment rencontré cette syntaxe, je ne connais pas la différence.

J'apprécierais que quelqu'un me fasse la différence.



1
Est-ce que cela répond à votre question? Y a-t-il une différence entre "==" et "is"?
juin

Il n'est pas clair si cette question concerne isvs ==, ou sur la nature de ce qui Noneest exactement et comment le comportement diffère dans l'un ou l'autre contexte (ce dernier est la raison pour laquelle je me suis retrouvé ici). Basé sur le flou et le manque de réponses OP ... Je suis surpris que cela ait autant de votes positifs. Je veux dire ... cmon ... la question n'est même pas écrite dans la vraie question ...
RTbecard

Réponses:


291

La réponse est expliquée ici .

Citer:

Une classe est libre d'implémenter la comparaison comme elle l'entend, et elle peut choisir de faire une comparaison avec None signifie quelque chose (ce qui a du sens; si quelqu'un vous a dit d'implémenter l'objet None à partir de zéro, comment pourriez-vous le faire comparer True contre lui-même?).

En pratique, il n'y a pas beaucoup de différence car les opérateurs de comparaison personnalisés sont rares. Mais vous devez utiliser is Noneen règle générale.


57
En outre, is Noneest un peu (~ 50%) plus rapide que == None:)
Nas Banov

26
@ myusuf3: >>> timeit.Timer ('None is None'). timeit () | 0,225 | >>> timeit.Timer ('Aucun == Aucun'). timeit () | 0,328
Nas Banov

9
@ myusuf3 Vous n'avez pas vraiment besoin d'une preuve pour cela. isest, fondamentalement, une comparaison entière alors que ==non seulement la résolution des références mais la comparaison des valeurs qui peuvent avoir des types incompatibles.
Pijusn

4
Un en faveur de "est". Lorsqu'une variable peut être None ou quelque chose qui n'a aucune comparaison significative avec None. Par exemple, une variable peut être un numpy.array ou None (mon cas particulier).
Jblasco

3
Je voudrais ajouter à ce que dit @TimLudwinski: premièrement, si quelqu'un choisit de remplacer l'opérateur d'égalité pour faire de None un cas spécial, pourquoi voudrions-nous lui dire le contraire? Deuxièmement, "Il devrait y avoir une - et de préférence une seule - manière évidente de le faire." Et le moyen évident de vérifier si quelque chose est égal à quelque chose est, bien, l'opérateur d'égalité.
Yuval

162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

56

Dans ce cas, ce sont les mêmes. Noneest un objet singleton (il n'en existe qu'un seul None).

is vérifie si l'objet est le même, tandis que == vérifie simplement s'ils sont équivalents.

Par exemple:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

Mais puisqu'il n'y en a qu'un None, ils seront toujours les mêmes et isrenverront True.

p = None
q = None
p is q # True because they are both pointing to the same "None"

17
Cette réponse n'est pas correcte, comme expliqué dans la réponse de Ben Hoffstein ci-dessous stackoverflow.com/questions/3257919/is-none-vs-none/… . x == Nonepeut s'évaluer Truemême si ce xn'est pas le cas, Nonemais une instance d'une classe avec son propre opérateur d'égalité personnalisé.
max

5

Si vous utilisez numpy,

if np.zeros(3)==None: pass

vous donnera une erreur lorsque numpy fait une comparaison élément par élément


3

Cela dépend de ce que vous comparez à Aucun. Certaines classes ont des méthodes de comparaison personnalisées qui == Nonediffèrent de is None.

En particulier, la sortie de a == None ne doit même pas être booléenne !! - une cause fréquente de bugs.

Pour un exemple spécifique, prenez un tableau numpy où la ==comparaison est implémentée élément par élément:

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.