Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python]Problême variable tableau

Empêcher les listes de se référencer relativement

Sujet résolu
    31 juillet 2011 à 2:34:00

    Bonjour

    J'effectue actuellement mes premiers pas avec Python, et essaye de réaliser un "Conway's Game of life", dans lequel je teste des matrices 10 * 10 cases remplies de booléens.

    Je construis ces matrices à la main dans l'interpréteur de commande, à partir d'une matrice remplie de 0.

    Lorsque j'essaye de copier cette matrice dans une nouvelle variable, pour créer de nouvelles grilles à tester, Python, au lieu d'assigner la valeur de ma matrice vide à la nouvelle variable, assigne la référence à celle-ci à la place, et répercute toute les modifications de l'une sur l'autre.

    Il se produit systématiquement :
    >>> A = [1,2] #Ma matrice de départ
    >>> A
    [1, 2]
    >>> B = A #J'essaye de la copier
    >>> B #B est supposée être complêtement nouvelle
    [1, 2]
    >>> B[0] = 15 #Je la modifie
    >>> B
    [15, 2]
    >>> A #La matrice d'origine a aussi été modifiée
    [15, 2]
    

    Comment forcer Python à mettre la valeur de la variable tableau en B plutôt qu'une référence vers celle-ci ? (Sans redéclarer ma nouvelle variable)

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      31 juillet 2011 à 8:41:48

      Il faut utiliser le module copy et sa méthode deepcopy

      >>> import copy
      >>> A = [1, 2]
      >>> B = copy.deepcopy(A)
      >>> B.append(15)
      >>> print(A)
      [1, 2]
      >>> print(B)
      [1, 2, 15]
      >>>
      
      • Partager sur Facebook
      • Partager sur Twitter
        31 juillet 2011 à 11:04:27

        Citation : Mobco


        >>> A = [1,2] #Ma matrice de départ
        >>> A
        [1, 2]
        >>> B = A #J'essaye de la copier
        


        Non, ton erreur est là, à la dernière ligne. En fait quand tu écris B=A, tu ne copies pas A, tu places juste une étiquette du nom de B sur l'objet référencé par A, donc tu peux agir sur cet objet ou bien par A ou bien par B et de façon équivalente, ce sont des alias.

        Le tuto ne signale pas ce problème qui est une difficulté que quasiment tout le monde a rencontré au moins une fois dans son apprentissage de Python ?

        Sinon, pour ton Jeu de la Vie, es-tu bien certain que copier toute la matrice soit bien nécessaire (d'une façon générale, en programmation, on évite de faire des copies, ou en tous cas, on regarde si on peut s'en abstenir).


        Citation : fred1599

        Il faut utiliser le module copy et sa méthode deepcopy



        Mouais, c'est bien compliqué d'utiliser un module ad hoc juste pour faire une copie de liste. D'ailleurs, dans son cas, deepcopy n'est pas nécessaire, copy suffira (sans parler de perforamnce, il me semble que deepcopy est une fonction très coûteuse, or un Jeu de la vie peut contenir des matrices très grosses et s'il faut souvent les mettre à jour ...)

        Sinon, dans sa situation, les façons usuelles de faire sont les suivantes :

        >>> A = [1, 2]
        >>> B=[a for a in A]
        >>> B[0]=15
        >>> A
        [1, 2]
        >>> B
        [15, 2]
        



        >>> A = [1, 2]
        >>> B=A[::]
        >>> B[0]=15
        >>> A
        [1, 2]
        >>> B
        [15, 2]
        >>>
        



        >>> A = [1, 2]
        >>> B=list(A)
        >>> B[0]=15
        >>> A
        [1, 2]
        >>> B
        [15, 2]
        >>>
        



        >>> A = [1, 2]
        >>> B=[]
        >>> for a in A: B.append(a)
        ... 
        >>> B
        [1, 2]
        >>> B[0]=15
        >>> A
        [1, 2]
        >>> B
        [15, 2]
        >>>
        





        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          31 juillet 2011 à 14:02:25

          Celui ci fonctionne aussi

          >>> A = [1, 2]
          >>> B = A[:]
          >>> B
          [1, 2]
          >>> B.append(15)
          >>> B
          [1, 2, 15]
          >>> A
          [1, 2]
          
          • Partager sur Facebook
          • Partager sur Twitter
            31 juillet 2011 à 16:24:46

            Citation : fred1599


            >>> B = A[:]
            


            Oui, en effet. C'est ce que je voulais écrire quand j'ai écrit B = A[::] et qui est inutilement long.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              31 juillet 2011 à 19:03:28

              J'ai pas trop les compétences pour rédiger un cour, mais ici, il y a des notions importantes à voir par rapport au fonctionnement de Python avec les objets.

              En Python, tout est référence à objet et il existe deux grandes catégories d'objets : les modifiables (ou mutables) et les non-modifiables (ou immuables). Sans rentrer dans les détails, les listes font partie des objets mutables.

              De peur de dire des conneries, je préfère laisser à chacun le plaisir de faire une recherche sur ces points très importants du langage. ;)
              • Partager sur Facebook
              • Partager sur Twitter

              [Python]Problême variable tableau

              × 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