IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de modification de listes égales


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut Problème de modification de listes égales
    Bonsoir,

    Je fais appel à votre sagacité...
    Voilà en effet un comportement des listes que je n'arrive pas à contourner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> L=[1,3,5]
    >>> K = L
    >>> L[1]=7
    >>> print K
    [1, 7, 5]
    1re question
    Ceci ne se produit qu'avec les listes, pourquoi ?
    2e question
    Comment contourner la difficulté ? Je voudrais pouvoir toucher à l'une sans que la modif affecte l'autre...

    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonsoir,

    par défaut python utilise des références.

    la ligne:

    est traduite par: L pointe vers la même adresse mémoire que K. Du coup, toute modification dans L se répercute dans K et inversement, car cela modifie une adresse mémoire commune.

    Cela ne se produit pas qu'avec des listes .

    pour que les listes soient indépendantes, il faut en quelque sorte faire une "copie". par exemple comme ceci:


  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Tu peux aussi utiliser:
    qui copie l'intégralité de L dans K

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut
    Bonsoir,

    Merci pour vos réponses...
    Je vais tester ça...
    kango, avec quoi cela se produit-il encore ? Parce que j'avais testé : cela ne produit pas avec les variables numériques :
    >>> a=2
    >>> b=a
    >>> a=3
    >>> print b
    2
    ni avec les chaînes :
    >>> a="bla"
    >>> b=a
    >>> a="bli"
    >>> print b
    bla
    Cordialement,

    @+

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    à ma connaissance avec tout sauf les types standards: str, float, int...

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Ça se produit avec tout, y compris les types de base, seulement on ne peut pas s'en rendre compte, étant donné que ces derniers sont en général immuables (mis à part les dicos et les listes), et donc que pour les manipuler, il faut réaffecter. La preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = 1
    >>> b = a
    >>> id(a)
    135720760
    >>> id(b)
    135720760
    En Python, tout est objet, et n'importe quelle variable ne contient qu'une référence vers un objet, pouvant être référencé par d'autres variables. Par suite, tout passage d'objet à une fonction ou méthode se fait par référence, et non par valeur. C'est une conséquence du fait que tout est objet, premièrement copier une instance de classe peut être coûteux, deuxièmement ce n'est en général pas le comportement attendu, notamment quand on commence à manipuler des classes un peu plus élaborées.

Discussions similaires

  1. [IShellLink] Problème de modification de raccourci
    Par Alcatîz dans le forum Windows
    Réponses: 2
    Dernier message: 17/11/2005, 09h39
  2. Réponses: 19
    Dernier message: 28/10/2005, 17h29
  3. Problème de raffraichissement de listes
    Par blondin01 dans le forum Access
    Réponses: 7
    Dernier message: 13/10/2005, 12h31
  4. Problème pour positionner une liste déroulante
    Par ouckileou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2004, 01h05
  5. [débutant] Problème JSplitPane (modif :InternalFrame)
    Par pingoui dans le forum Agents de placement/Fenêtres
    Réponses: 61
    Dernier message: 03/09/2004, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo