628 votes

Est-il une différence entre `==` et `est` en python?

Mon Google-fu m'a laissé tomber.

En Python, sont ceux-ci:

n = 5
# Test one.
if n == 5:
    print 'Yay!'

# Test two.
if n is 5:
    print 'Yay!'

deux tests pour l'égalité équivalent (ha!)? Ne c'est valable pour les objets où vous seriez en comparant les instances ( list - dire)?

Ok, donc ce genre de réponses à ma question:

L = []
L.append(1)
if L == [1]:
    print 'Yay!'
# Holds true, but...

if L is [1]:
    print 'Yay!'
# Doesn't.

Donc, == tests de valeur où l' is tests pour voir si elles sont le même objet?

1137voto

Torsten Marek Points 27554

is sera de retour True si les deux variables pointent vers le même objet, == si les objets visés par les variables sont égales.

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

Dans votre cas, le deuxième test ne fonctionne que parce que Python caches petit entier des objets, ce qui est un détail d'implémentation. Pour les grands nombres entiers, cela ne fonctionne pas:

>>> 1000 is 10**3
False
>>> 1000 == 10**3
True

La même chose vaut pour les littéraux de chaîne:

>>> "a" is "a"
True
>>> "aa" is "a" * 2
True
>>> x = "a"
>>> "aa" is x * 2
False
>>> "aa" is intern(x*2)
True

Veuillez voir cette question ainsi.

398voto

John Feminella Points 116878

Il y a une règle simple pour vous dire quand utiliser == ou is.

  • == est pour la valeur de l'égalité. L'utiliser quand vous voulez savoir si deux objets ont la même valeur.
  • is est pour la référence à l'égalité. L'utiliser quand vous voulez savoir si deux références se rapportent au même objet.

En général, lorsque vous comparez quelque chose à un type simple, vous êtes généralement la vérification de la valeur de l'égalité, de sorte que vous devez utiliser ==. Par exemple, l'intention de votre exemple est sans doute pour vérifier si x a une valeur égale à 2 (==), de ne pas s' x est littéralement référence au même objet que 2.


Autre chose à noter: en raison de la façon dont le Disponible de référence de mise en œuvre de travaux, vous aurez inattendus et des résultats incohérents si par erreur vous utilisez is à comparer par référence à l'égalité sur des entiers:

>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False

C'est à peu près ce que nous attendions: a et b ont la même valeur, mais sont des entités distinctes. Mais que penser de cela?

>>> c = 200
>>> d = 200
>>> c == d
True
>>> c is d
True

Cela est incompatible avec le résultat antérieur. Ce qui se passe ici? Il s'avère que l'implémentation de référence de Python caches entier des objets dans la plage de -5..256 en tant que singleton cas pour des raisons de performances. Voici un exemple illustrant ce:

>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i)));
... 
250: True
251: True
252: True
253: True
254: True
255: True
256: True
257: False
258: False
259: False

C'est une autre raison évidente de ne pas utiliser is: le comportement est à gauche jusqu'à implémentations lorsque vous êtes à tort de l'utiliser pour la valeur de l'égalité.

48voto

stephenbayer Points 5548

== détermine si les valeurs sont équivalentes, alors que "est" détermine si elles sont à l'exact même objet.

21voto

Dan Points 18831

Ils sont complètement différents. is vérifie l'identité de l'objet, tandis que l' == des contrôles pour l'égalité (une notion qui repose sur les deux opérandes de types).

C'est seulement une coïncidence heureuse que "is" semble fonctionner correctement avec les petits entiers (par exemple, 5 == 4+1). C'est parce que Disponible optimise le stockage de nombres entiers dans l'intervalle (de -5 à 256), en faisant d'eux des singletons: http://www.python.org/doc/2.5/api/intObjects.html#l2h-381

16voto

Ryan Points 7035

Notez que c'est pourquoi, if foo is None: est le préféré null comparaison pour python. Tous les objets nuls sont vraiment des pointeurs vers la même valeur, python met de côté pour dire "Aucun"

if x is True: et if x is False: également travailler d'une manière similaire. Faux et Vrai sont deux objets spéciaux, tous les vrais valeurs booléennes sont remplies et toutes les fausses valeurs booléennes sont Fausses

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