Bonjour à tous,

Tout est un peu dans le titre : codant une bête fonction de gestion de matrice (à dimensions multiples), et lançant le programme, j'ai fini par perdre patience à ne pas comprendre une erreur simple. Lorsque je décalais dans une matrice une colonne ou une ligne (ou d'une dimension à l'autre), je modifiais l'objet voulu mais aussi l'objet d'origine (qui devait lui, demeurer intact).

Non sans difficulté (sic !), j'ai fini par remettre la main sur l'erreur, un dictionnaire semblant ne pouvoir ""simplement"" se copier par affectation. En somme Dict2 = Dict1, Dict2 reste une référence de Dict1.
> Question 1: je suis dans le vrai ? Je n'ai pas trouvé spécialement clair la documentation à ce sujet (à ce propos si vous connaissez une bonne traduction...).

Python n'est pas mon langage de programmation "natif" (PHP), et j'avoue que je suis face à un abyme de perplexité face à ce comportement.
> Question 2: Comment dupliquer un dictionnaire (avec tout ce qu'il contient, ordre et affectation interne), sans créer juste une référence supplémentaire à son original? Pour la liste j'ai trouvé [:], mais qui ne fonctionne pas avec les dictionnaires. J'ai essayé Dict2 = dict(Dict1), mais sans résultat probant (création d'une référence). J'ai finalement essayé Dict2 = dict() puis boucler ligne à ligne les affectations de Dict1 dans Dict2 (et devinez quoi? Ben ça crée une référence).

J'ai même essayé Dict2 = dict((list(Dict1)[:])) - sait-on jamais...

Accessoirement, c'est ce genre de petit détail rageant qui vous dit que tous les langages ne sont pas tous aussi «accessibles» qu'on peut bien le lire parfois et, pour être honnête, ça donne l'impression d'un langage pas très abouti, même si je l'aime bien pour des petites routines... :/
> Question 3: Python, bon pour apprendre mais pas pour travailler? (ne me tapez pas)

Citation Envoyé par mont29 Voir le message
Autrement dit, la copie d’une string (ou int, float, etc.) donne toujours un nouvel objet, alors que la copie d’une liste (ou d’un dict, ou n’importe quel objet évolué) est “shallow”, c’est le même objet qui est assigné à la copie…

D’où la vicieuse subtilité qui t’a posé problème : l’expression d’initialisation par défaut des variables d’une fonction est évaluée une seule fois, lors de la construction de cette fonction par le parseur, et les valeurs ainsi obtenues sont copiées à chaque appel de cette fonction, si nécessaire – donc, tu te retrouve toujours avec la même liste ! Oui, c’est vraiment vicieux, et bravo pour avoir trouvé une solution tout seul
Bonne fin d'après-midi!