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 :

débutant - Valeur de l'argument modifié par une fonction [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Par défaut débutant - Valeur de l'argument modifié par une fonction
    Bonsoir tout le monde ,

    Je suis sur ce qui me parrait être u casse tête :

    Supposons la portion de code suivante


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    a={'Polygon': [{'X': 0, 'Y': 0.050663866102695465}, {'X': 0, 'Y': 0.05053243413567543}, {'X': 0, 'Y': 0.09577736258506775}, {'X': 0, 'Y': 0.09590491652488708}]}
     
    def functionA(dictionnaire):
        copie = dictionnaire
        for element in copie["Polygon"]:
            element["X"]=5
        return copie
     
    test = functionA(a)
     
    print ("Valeur de A :", a)
    print ("Valeur de la copie :", test))
    :

    Valeur de A : {'Polygon': [{'X': 5, 'Y': 0.050663866102695465}, {'X': 5, 'Y': 0.05053243413567543}, {'X': 5, 'Y': 0.09577736258506775}, {'X': 5, 'Y': 0.09590491652488708}]}
    Valeur de la copie : {'Polygon': [{'X': 5, 'Y': 0.050663866102695465}, {'X': 5, 'Y': 0.05053243413567543}, {'X': 5, 'Y': 0.09577736258506775}, {'X': 5, 'Y': 0.09590491652488708}]}

    Je ne comprends pas pourquoi la valeur de a est modifiée. Quelqu’un peut-il m'éclairer?

    Merci d'avance !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salutations !

    Il faut faire une vraie copie c'est le problème avec les listes et dictionnaires et encore plus avec celles imbriquées dans d'autres listes ou dictionnaires !

    Au moins deux solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    a={'Polygon': [{'X': 0, 'Y': 0.050663866102695465}, {'X': 0, 'Y': 0.05053243413567543}, {'X': 0, 'Y': 0.09577736258506775}, {'X': 0, 'Y': 0.09590491652488708}]}
     
    def functionA(dictionnaire):
        copie = {key:[d.copy() for d in value] for key, value in dictionnaire.items()}
        for element in copie['Polygon']:
            element['X']=5
        return copie
     
    test = functionA(a)
     
    print ("Valeur de A :", a)
    print ("Valeur de la copie :", test)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from copy import deepcopy
     
    a={'Polygon': [{'X': 0, 'Y': 0.050663866102695465}, {'X': 0, 'Y': 0.05053243413567543}, {'X': 0, 'Y': 0.09577736258506775}, {'X': 0, 'Y': 0.09590491652488708}]}
     
    def functionA(dictionnaire):
        copie = deepcopy(dictionnaire)
        for element in copie['Polygon']:
            element['X']=5
        return copie
     
    test = functionA(a)
     
    print ("Valeur de A :", a)
    print ("Valeur de la copie :", test)

  3. #3
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Citation Envoyé par awawawa Voir le message
    Je ne comprends pas pourquoi la valeur de a est modifiée. Quelqu’un peut-il m'éclairer?
    C'est ce qu'on appelle dans le jargon un effet de bord. En cherchant sur ton moteur de recherche ces termes, tu y trouveras des explications plus complètes...

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par awawawa Voir le message
    Je ne comprends pas pourquoi la valeur de a est modifiée. Quelqu’un peut-il m'éclairer?
    Parce que Python travaille à l'économie. Et que copier un gros truc (ici un dictionnaire) sera plus rapide s'il se contente de copier juste la référence (l'adresse). Ainsi tu te retrouves avec deux variables pointant vers le même objet.
    Dans 95% des cas, cela suffit. Mais si toi tu es dans les 5% restants et que tu veux vraiment une copie distincte de ton objet, il te faut alors le demander explicitement, chose que permet Python via la création à chaud d'un second dictionnaire à partir du premier => copie=dict(dictionnaire).

    Attention toutefois, cette manipulation ne fonctionne que sur un niveau. Si ton "dictionnaire" contient lui-même des objets complexes, la copie ne récupèrera que leurs références. Ok "dictionnaire" et "copie" seront distincts mais leur contenu, lui, pointeront vers les mêmes objets. Si tu tombes dans ce cas et que ça te gêne, il faut procéder de la même manière sur le contenu (et etc etc si ledit contenu contient lui-même des objets complexes). Chose qui est offerte par la fonction "deepcopy()" du module "copy" comme le montre LeNarvalo.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Par défaut
    Merci tout le monde pour vos réponses,

    J'avais trouvé la réponse hier en naviguant, j'allais mettre le thread à jour. Bien que vos explications soient complètes, je me permets d'ajouter un lien qui pourrait permettre à certaines personnes de comprendre en ayant une explication formulée différemment : https://www.programiz.com/python-programming/methods/dictionary/copy"]ici

    C'est assez drôle, parceque en c/c++ on se retrouve généralement confronté au problème inverse. Le compilateur fait des copies des arguments de fonction, d'où l'obligation de passer par un appel par pointeur ou référence si on veut modifier une variable...

    En tout cas merci tout le monde,

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

Discussions similaires

  1. [11gR2] Updatexml - modifier par une valeur d'une autre table
    Par Erwan T dans le forum SQL
    Réponses: 2
    Dernier message: 17/02/2021, 09h48
  2. Réponses: 14
    Dernier message: 30/03/2013, 18h41
  3. arguments modifiés par la fonction
    Par piotrr dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 31/10/2007, 11h11
  4. valeur d'un champ text modifié par une variable en parametre
    Par klimero dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 21/04/2006, 10h39
  5. [VBA]Affectation d'une valeur à une cellule par une fonction
    Par lallougri dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/02/2006, 14h24

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