Pourquoi la liste b peut-elle être trouvée dans some_list alors qu'elle n'est pas dans some_list?

>>> a = []
>>> b = []
>>> a is b
False
>>> some_list = [0, 1, 2, 3, a]
>>> some_list.index(b)
4
1
Charles Holbrow 13 oct. 2011 à 18:29

4 réponses

Meilleure réponse

list.index de Python recherche les tests d'égalité, pas d'identité. a et b ne sont pas identiques, mais égaux:

>>> a = []
>>> b = []
>>> a == b
True

Définissez __eq__ sur vos objets a, b si vous le souhaitez une définition différente de l'égalité, par exemple:

def __eq__(self, other):
  return self is other
def __hash__(self):
  return 0 # Insert a more sensible, object-specific hash function here
6
phihag 13 oct. 2011 à 15:26

.index renvoie la 4ème position car il compare a et b, deux listes vides. Ils sont égaux. Si vous faites a is b, il compare les adresses mémoire des objets, et elles sont différentes, c'est pourquoi cette expression est évaluée à False.

In [1]: a = []
In [2]: b = []
In [3]: a == b
Out[3]: True
7
culebrón 13 oct. 2011 à 14:31

Essayez d'exécuter le a == b. L'opérateur '==' vérifie si les valeurs des variables sont les mêmes, tout comme la fonction d'index. La fonction is comapres les variables id ().

Cela pourrait être utile:

>>> a = []
>>> b = []
>>> id(a)
4299650400
>>> id(b)
4299730096
>>> a == b
True
>>> a is b
False

Notez également celui-ci:

>>> some_list = [0, 1, 2, 3, a]
>>> some_list.index(b)
4
>>> some_list[4] == b
True
>>> some_list[4] is b
False
1
Gandi 13 oct. 2011 à 14:33

Ils sont différents:

a is b

N'est vrai que s'ils sont tous deux liés au même objet. Cependant, l'index vérifie uniquement si les valeurs sont égales.

Pour mettre un exemple C, 3 == 3 mais

int a = 3;
int b = 3;
&a == &b // this is false
1
Foo Bah 13 oct. 2011 à 14:33
7755696