Partage
  • Partager sur Facebook
  • Partager sur Twitter

Véracité d'une expression (avec == et mot clé is)

Sujet résolu
    18 juin 2014 à 15:29:16

    Bonjour ou Bonsoir,

    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 !

    • Partager sur Facebook
    • Partager sur Twitter
    Ils ne savaient pas que c'était impossible, alors ils l'ont fait. ~ Mark Twain ~
      18 juin 2014 à 15:48:20

      Un petit lien qui pourra peut-être t'aider: ici

      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
        18 juin 2014 à 17:41:06

        is retournera True si deux variables pointent vers le même objet, == si les objets visés par les variables sont égaux.
        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2014 à 19:21:32

          En français, on pourrait dire que deux objets égaux ne sont pas toujours identiques.
          • Partager sur Facebook
          • Partager sur Twitter
            18 juin 2014 à 21:13:53

            Merci,

            Ma question,pour faire simple, est pourquoi pour la classe Rien (), a == b : False

             et pour list (), a==b : True ?? o_O

            -
            Edité par Walyer 18 juin 2014 à 21:30:24

            • Partager sur Facebook
            • Partager sur Twitter
            Ils ne savaient pas que c'était impossible, alors ils l'ont fait. ~ Mark Twain ~
              18 juin 2014 à 21:30:05

              Je pense que c'est parceque tu n'as pas défini la méthode qui est appellée lorsque tu fais une telle comparaison

              -
              Edité par Nemeric 18 juin 2014 à 21:30:58

              • Partager sur Facebook
              • Partager sur Twitter
                18 juin 2014 à 21:54:23

                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.

                • Partager sur Facebook
                • Partager sur Twitter
                  19 juin 2014 à 10:01:44

                  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.

                  -
                  Edité par Olygrim 19 juin 2014 à 10:21:14

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Précepte: Le mieux est l'ennemi du bien
                    19 juin 2014 à 10:46:54

                    C'est globalement ça.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zeste de Savoir, le site qui en a dans le citron !
                      19 juin 2014 à 11:12:10

                      Merci pour toutes vos réponses !

                      • Partager sur Facebook
                      • Partager sur Twitter
                      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.
                      • Editeur
                      • Markdown