ProgrammationDéveloppeur Backend/Python

Expliquez la sémantique de l'opérateur is et de l'opérateur == en Python. Quelle est la différence entre eux et quand l'utilisation de chacun est critique ? Donnez des exemples de pièges typiques.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

  • is compare l'identité des objets (c'est-à-dire si les variables pointent vers la même zone de mémoire).
  • == (opérateur eq) compare les valeurs, c'est-à-dire si les objets sont égaux en termes de leur contenu.

is doit être utilisé pour comparer précisément l'identité (par exemple, avec None ou pour des objets singleton), et non pour vérifier l'égalité des valeurs.

Exemple :

a = [1, 2, 3] b = [1, 2, 3] print(a == b) # True print(a is b) # False c = None d = None print(c is d) # True

Lorsqu'il s'agit de petits entiers ou de chaînes, l'interpréteur peut utiliser "l'internement" (objets mis en cache), ce qui rend parfois is vrai pour des valeurs égales, mais cela ne doit pas être utilisé dans la logique du programme.


Question piège

Question : Que renverra le code suivant ?

a = 256 b = 256 print(a is b) c = 257 d = 257 print(c is d)

Pourquoi ?

Réponse : Pour les valeurs de -5 à 256, Python utilise un pool d'entiers. Les valeurs dans cette plage pointent toujours vers les mêmes objets, donc a is b renverra True. 257 est déjà en dehors du pool, donc c is d sera False (les objets sont indépendants).


Histoire

Exemple 1

Dans un microservice, la vérification de l'égalité des chaînes a été effectuée avec is au lieu de ==. En raison des optimisations de l'interpréteur, le programme fonctionnait "de manière stable" dans les tests, mais a commencé à échouer après une recompilation ou d'autres modifications de l'environnement.


Exemple 2

Un développeur a utilisé l'opérateur is pour comparer des nombres au lieu de ==. Cela a fonctionné pour les petits nombres (grâce au pool), mais pour les grands — cela a échoué et a donné des résultats imprévisibles, entraînant un dysfonctionnement des calculs.


Exemple 3

Dans la conception d'un système d'autorisation, le JSON reçu a été vérifié avec is None (correct), et ensuite par analogie, ils ont fait de même pour les chaînes : if status is "ok". Cela s'est avéré une erreur — parfois la condition n'était pas satisfaite, conduisant à une logique de traitement des données erronée.