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 :

des references et des copies en Python ?


Sujet :

Python

  1. #1
    Membre confirmé Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Par défaut des references et des copies en Python ?
    bonjour,
    desole par avance des questions que je pose, mais je debute en python.
    je debuggais mon programme quand je suis tomber sur un truc bizzard.
    du coup j'ai fait un exemple, pour que l'on m'explique.

    je ne vois pas clair dans l'affectation de reference et la copie ...
    pour illustrer, voici un code que j'aimerai mieux comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    a = [ [1], [2] ]
    b = [ [1], [2] ]
    c = [ [1], [2] ]
    d = [ [1], [2] ]
     
    e = [ 4, 5 ]
    f = [ 4, 5 ]
    g = [ 4, 5 ]
    h = [ 4, 5 ]
     
    for k in a:
      k.append(e)
    print a
     
    for k in b:
      k.append(f[:])
    print b
     
    for k in c:
      k.append(g)
    print c
     
    for k in d:
      k.append(h[:])
    print d
    print "----"
     
    e = "modif via e"
    f = "modif via f"
    g[0] = "modif via g[0]"
    h[0] = "modif via h[0]"
    print a
    print b
    print c
    print d
    print "----"
     
    a[0][1][1] = "modif via a[0][1][1]"
    b[0][1][1] = "modif via b[0][1][1]"
    c[0][1][1] = "modif via c[0][1][1]"
    d[0][1][1] = "modif via d[0][1][1]"
    print a
    print b
    print c
    print d
    print e
    print f
    print g
    print h
    qui donne comme resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [[1, [4, 5]], [2, [4, 5]]]
    [[1, [4, 5]], [2, [4, 5]]]
    [[1, [4, 5]], [2, [4, 5]]]
    [[1, [4, 5]], [2, [4, 5]]]
    ----
    [[1, [4, 5]], [2, [4, 5]]]
    [[1, [4, 5]], [2, [4, 5]]]
    [[1, ['modif via g[0]', 5]], [2, ['modif via g[0]', 5]]]
    [[1, [4, 5]], [2, [4, 5]]]
    ----
    [[1, [4, 'modif via a[0][1][1]']], [2, [4, 'modif via a[0][1][1]']]]
    [[1, [4, 'modif via b[0][1][1]']], [2, [4, 5]]]
    [[1, ['modif via g[0]', 'modif via c[0][1][1]']], [2, ['modif via g[0]', 'modif via c[0][1][1]']]]
    [[1, [4, 'modif via d[0][1][1]']], [2, [4, 5]]]
    modif via e
    modif via f
    ['modif via g[0]', 'modif via c[0][1][1]']
    ['modif via h[0]', 5]
    merci par avance de m'expliquer comment etre sur lorsque c'est une reference et lorsque c'est une copie.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    En Python, les affectations ne font pas de copies. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>>a = [1,2]
    >>>b = a
    a et b font référence à la même liste. D'où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>>b.append(3)
    >>>a
    [1,2,3]
    Par contre, réaffecter 'a' changera sa référence, donc ne permettra plus d'accéder à la liste, sauf s'il reste d'autres références (comme 'b').
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>>a = "test"
    >>>b
    [1,2,3]
    >>>a
    'test'
    Pourquoi ce comportement ? Parce que les listes sont des objets ! Et en objet, on ne fait pas des copies d'objets, mais des copies de références.

    On peut toutefois forcer la création d'une nouvelle liste contenant les mêmes valeurs qu'une autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>>a = [1,2]
    >>>b = a[:]
    >>>b.append(3)
    >>>b
    [1,2,3]
    >>>a
    [1,2]
    Ici, j'ai demandé à 'b' de recevoir une nouvelle liste avec tous les éléments contenus dans 'a'. L'opération m'a retourné une nouvelle liste, une copie de la première. Mais comme ce sont deux objets distincts, elles sont indépendantes.

    En espérant t'éclairer

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Ah oui, pour reprendre tes exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>>a = [1,2]
    >>>b = [3,4]
    >>>a.append(b)
    >>>a
    [1, 2, [3, 4] ]
    >>>b.append(5)
    >>>a
    [1, 2, [3, 4, 5] ]
    C'est explicite : 'append' a inséré la référence vers 'b' dans 'a'. Donc toute modification de la liste liée à 'b' est visible depuis 'a'.

    Maintenant, comme je l'ai dit plus haut, faire 'a.append(b[:])' insérera une nouvelle liste dans 'a', qui contiendra les mêmes valeurs (ou références) que 'b'.

  4. #4
    Membre confirmé Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Par défaut
    c'est assez clair, merci pour l'explication

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 09h44
  2. Réponses: 4
    Dernier message: 02/04/2008, 17h51
  3. Réponses: 3
    Dernier message: 13/09/2007, 18h11
  4. Des DLL et des references
    Par Invité dans le forum Visual C++
    Réponses: 2
    Dernier message: 21/04/2007, 10h25
  5. Réponses: 3
    Dernier message: 23/01/2007, 08h14

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