407 votes

Quelle est la différence entre "is None" et "== None" ?

Je suis récemment tombé sur cette syntaxe, je ne connais pas la différence.

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

6 votes

2 votes

Cela répond-il à votre question ? Y a-t-il une différence entre "==" et "est" ?

0 votes

Ce n'est pas clair si cette question concerne is vs == ou sur la nature de ce qui est exactement None et comment le comportement diffère dans l'un ou l'autre contexte (c'est pour cette dernière raison que j'ai atterri ici). Vu l'imprécision et le manque de réponses du PO... Je suis surpris qu'il y ait autant de votes positifs. Je veux dire... allez... la question n'est même pas écrite dans la question elle-même...

366voto

Ben Hoffstein Points 44398

La réponse est expliquée aquí .

Je cite :

Une classe est libre d'implémenter comparaison de la manière qu'elle souhaite et peut choisir de faire la comparaison contre Aucun ne signifie quelque chose (ce qui est en fait est logique ; si quelqu'un vous disait d'implémenter d'implémenter l'objet None à partir de à partir de rien, comment feriez-vous autrement pour qu'il comparer True à lui-même).

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

0 votes

C'était une lecture intéressante (et courte). Et quelques informations utiles sur le is v. == .

85 votes

Aussi, is None est un peu (~50%) plus rapide que == None :)

30 votes

@myusuf3 : >>> timeit.Timer('None est None').timeit() | 0.225 | >>> timeit.Timer('None == None').timeit() | 0.328

183voto

unutbu Points 222216
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

0 votes

Ver stackoverflow.com/a/26611/143931 pour des commentaires intéressants sur cette réponse.

58voto

Donald Miner Points 18116

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

is vérifie si l'objet est le même objet, 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 comme il n'y a qu'un seul None ils seront toujours les mêmes, et is retournera Vrai.

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

19 votes

Cette réponse n'est pas correcte, comme l'explique la réponse de Ben Hoffstein ci-dessous. stackoverflow.com/questions/3257919/is-none-vs-none/ . x == None peut être évalué à True même si x n'est pas None mais une instance d'une certaine classe avec son propre opérateur d'égalité personnalisé.

31voto

PGlivi Points 428

Cela dépend de ce que vous comparez à None. Certaines classes ont des méthodes de comparaison personnalisées qui traitent == None différemment de is None .

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

Pour un exemple spécifique, prenons un tableau numpy dans lequel l'élément == La comparaison est mise en œuvre par éléments :

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

6voto

jf328 Points 1833

Si vous utilisez numpy,

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X