Je n'arrive pas à comprendre pourquoi certaines de ces expressions sont vraies et d'autres fausses !
Je voudrai que vous m'éclairez un peu sur le sujet !
Voici mon code :
>>> a = int ()
>>> b = int ()
>>> a == b
True
>>> a is b
True
>>> a = list ()
>>> b = list ()
>>> a == b
True
>>> a is b
False
>>> a = Rien () # Rien () : classe de ma création qui ne contient que sa documentation
>>> b = Rien ()
>>> a == b
False
>>> a is b
False
>>>
Merci d'avance !
Ils ne savaient pas que c'était impossible, alors ils l'ont fait. ~ Mark Twain ~
Une list est un objet de base Python. Comme c'est un conteneur d'objet, on peut s'attendre à ce que deux listes vides soient égales. Il en est de même pour deux listes qui contiennent la même suite d'objets. Il y a du code derrière qui rendront les listes utilisables pour le programmeur.
Si vous créez votre propre "class" (sans hériter de list), il faudra donner un sens à "==" en définissant les méthodes __eq__ et __cmp__.
Mais ceci ne fait que répéter ce qu'à déjà écrit Nemeric en plus concis.
Je pense que c'est aussi une histoire d'objet muable/immuable et d'étiquette. Après quelques recherches, j'en ai conclu (conclusion purement personnelle, donc à prendre avec des pincettes) qu'une variable telle qu'entendu en python est a décomposé en 2 morceaux: l'objet et l'étiquette. L'étiquette est le nom (ou l'identifiant si tu préfère) donné à ta variable, et l'objet c'est son type et sa valeur.
Un objet immuable (tel un entier) ne va créer qu'un objet (ie le type entier + la valeur) en mémoire de celui-ci. Et sur cette objet on va déposer des étiquettes (les noms de tes variables):
a = 1
b = 1
c = 1 # Les étiquettes a, b et c pointent tous vers le même objet: l'entier 1
d = a
e = b
f = c # id(a) == id(b) == id(c) == id(d) == id(e) == id(f)
Donc si je change la valeur de "a", je ne vais pas changé l'objet int 1 mais seulement déplacer mon étiquette "a" sur un nouvel objet.
Par contre pour un objet muable (tel une liste), c'est différent. Étant donné que l'objet est muable, c'est-à-dire qu'il peut changer sa valeur tout en restant à la même adresse mémoire, 2 objets identiques auront donc 2 adresses mémoires différentes. C'est le cas pour 2 listes vides. Pour mieux le comprendre, faisons un raisonnement par l'absurde: si toutes les étiquettes pointent sur un seul objet liste vide: [] et que l'objet est muable, alors si je change la valeur de cet objet, l'objet liste vide n'existera plus (au sens ou [] à évoluer et n'est plus vide). Ce qui serait un peu problématique.
a = list()
b = list()
c = list() #Ici les 3 étiquettes pointent vers des objets différents
Par contre dans le cas d'une égalité, on rajoute une étiquette à l'objet:
d = a
e = b
f = c #on ajoute l'étiquette f sur l'objet désigné par c
Un dernier point: quand tu veux "ajouter" (en faisant une égalité) une étiquette à un objet muable dont tu lui applique une méthode:
d = a.append(3)
Et bien là il faut aller voir dans la documentation ce que renvoie la méthode: help(list.append). Dans le cas présent, la méthode append renvoie un objet None, et donc l'étiquette "d" ne va pas pointer vers la liste identifié avec l'étiquette "a", ou vers un nouvel objet (comme on pourrait si attendre), mais pointer vers l'objet None (on ajoute l'étiquette "b" à l'objet None).
Edit: Et pour ajouter un peu de sel dans tout ça, il faut aussi tenir compte des espaces des noms. Mais là je te laisse regarder par toi même pour plus de détails.
ATTENTION: comme je l'ai dit au début, ce n'est que ma propre interprétation construite au fur et à mesure de mes recherches/essais.
Ils ne savaient pas que c'était impossible, alors ils l'ont fait. ~ Mark Twain ~
Véracité d'une expression (avec == et mot clé is)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.