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 :

curiosité (?) python dans l'affectation


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Points : 40
    Points
    40
    Par défaut curiosité (?) python dans l'affectation
    Bonjour,
    je suis récemment tombé sur un problème dont la résolution m'a laissé perplexe.
    Considérons la séquence ci-dessous qui résumé le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a=1
    b=[]
    b.append(a)
    b[-1]=2
    print a, b
     
    c=[1,2,3,4]
    d=[]
    d.append(c)
    d[-1][1]=10
    print c, d

    L'exécution donne :
    1 [2]
    [1, 10, 3, 4] [[1, 10, 3, 4]]


    La première séquence produit le résultat attendu : "b" est modifié, "a"a garde sa valeur initiale "1". "b[-1]" opère sur la valeur et non sur "a".
    Par contre dans la seconde séquence, la modification de "b" modifie aussi "c". Ici on n'opère pas sur la valeur de "d", mais sur celle de "c" qui a servi à initialiser "c".

    Ceci est-il cohérent ?
    Je suis sous Ubuntu avec python 2.

    Cordialement

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par jam7575 Voir le message
    Ceci est-il cohérent ?
    En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    c=[1,2,3,4]
    d=[]
    d.append(c)
    vous ne faites qu'ajouter une référence à l'objet [1,2,3,4].
    Comme c'est un objet "mutable", on peut le modifier en y accédant depuis d[0] ou depuis c... mais c'est toujours le même objet.

    Ici, c'est un peu différent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a=1
    b=[]
    b.append(a)
    b[-1]=2
    Une façon de voir les choses est de dire qu'un entier n'est pas "mutable". Mais je préfère ici parler d'assignation: si vous assignez un autre objet (le 2) à la dernière case de la liste "b", çà ne va pas modifier ce à quoi "a" aura été assigné.

    notez la différence entre b[-1] le dernier élément de la liste et b[-1][1] ou en plus vous dites le deuxième élément du dernier élément de "b".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Points : 40
    Points
    40
    Par défaut
    Merci pour ce retour rapide.
    Je ne connaissais pas cette notion de "mutable" et ne l'ai jamais lue concernant python.
    C'est en tout cas assez déroutant. Je n'ai jamais rien vu de tel dans les langages que j'ai pu pratiquer (PL1, Fortran, Cobol, assembleurs, C, Perl, Basic, Java, Javascript, Pascal entre autres) et j'ai mis pas mal de temps à comprendre le problème que j'avais.
    Cordialement

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par jam7575 Voir le message
    Je ne connaissais pas cette notion de "mutable" et ne l'ai jamais lue concernant python.
    Relisez attentivement la documentation.
    Vous avez plein de phrases contenant le mot "mutable" dans le seul chapitre builtins types.
    Et vous avez aussi des "implications" sur les méthodes qui les modifient.
    Pour un objet mutable, çà retournera None alors que sinon, çà retourne le nouvel objet.

    Citation Envoyé par jam7575 Voir le message
    C'est en tout cas assez déroutant. Je n'ai jamais rien vu de tel dans les langages que j'ai pu pratiquer (PL1, Fortran, Cobol, assembleurs, C, Perl, Basic, Java, Javascript, Pascal entre autres) et j'ai mis pas mal de temps à comprendre le problème que j'avais.
    Il y a plusieurs notions bien mélangées dans votre petit exemple: mutable, assignation, référence vs. copie... Et, pour sûr, Python fait les choses assez différemment.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Vous retrouvez ce concept aussi dans d'autres langages. On appelle ça des pointeurs, ou des références. C'est le même mécanisme ici. Une liste est un objet, et tout objet en Python est un pointeur.

  6. #6
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Points : 40
    Points
    40
    Par défaut
    Merci encore,
    quand je disais ne pas avoir lu "mutant" dans les bouquins de Python, c'est vrai.
    Je viens de regarder cette notion en la recherchant sur Internet.
    Effectivement Python présente des originalités et, considérant nombre de langages, je le trouve génial et l'apprécie (en fait je m'amuse avec). Malheureusement, dans le vocabulaire et dans l'utilisation, j'ai tendance à utiliser les "anciennes" notions.
    Mazis je progresse, grâce à vous entre autres.
    Cordialement

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 714
    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 714
    Points : 31 026
    Points
    31 026
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    Bonjour,
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    c=[1,2,3,4]
    d=[]
    d.append(c)
    d[-1][1]=10
    print c, d
    Bonjour

    Ton problème peut se reproduire de façon plus simple ainsi:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    c=[1,2,3,4]
    d=c
    d[-1]=10
    print c, d

    Et de ton côté, en écrivant
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    c=[1,2,3,4]
    d=[]
    d.append(c[:])
    d[-1][1]=10
    print c, d
    Ca aurait produit un résultat conforme à tes attentes. En effet, l'opérateur [x:y] (appelé "slice") génère une copie de la liste d'origine pour les éléments placés entre "x" inclus et "y" exclus (et du premier au dernier si on ne met rien pour "x" ou "y"). Donc dans ce cas précis, ça aurait rajouté à "d" une copie de "c". Ainsi, modifier "d" ne modifie plus "c". Garde cette astuce en tête pour le jour où tu voudras copier des listes...

    De même...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    c=[1,2,3,4]
    d=c[:]
    d[-1]=10
    print c, d
    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]

  8. #8
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Points : 40
    Points
    40
    Par défaut
    Merci beaucoup,
    mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    c=[1,2,3,4]
    d=[]
    d.append(c[:])
    d[-1][1]=10
    print c, d
    produit :

    [1, 2, 3, 4] [[1, 10, 3, 4]]

    un "d" à deux dimensions, et non à une seule dimension.
    Mais peu importe, tout ceci est fort amusant...
    Par ailleurs mon "pb" est résolu, fort aisément. Je tenais seulement à comprendre ce qui m'était arrivé. Maintenant c'est clair, mais cette notion, propre à python me semble-t-il, doit provoquer des difficultés pour qui, comme moi, passe d'un langage à un autre, sans en soupçonner nécessairement toutes les nuances.
    Cordialement

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 714
    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 714
    Points : 31 026
    Points
    31 026
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    un "d" à deux dimensions, et non à une seule dimension.
    M'a semblé que le but fondamental de ton exemple était de montrer que les deux variables accédent à la même zone mémoire. Pour ça, une seule dimension suffit

    Citation Envoyé par jam7575 Voir le message
    mais cette notion, propre à python me semble-t-il...
    Il te semble mal...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int c={1, 2, 3, 4};
    int *d=c;
    c[3]=10;
    for (int i=0; i < 4; i++) printf("%d\n", d[i]);
    Et pareil en C++, C# et peut-être aussi en Java. En fait, ce problème se retrouve à mon avis probablement dans tous les langages dès qu'on se met à manipuler des types "lourds". Mais Python t'offre déjà une première solution (le slice). Alors que reproduire le slice en C/C++ là ça devient un peu plus ardu...

    Citation Envoyé par jam7575 Voir le message
    Par ailleurs mon "pb" est résolu, fort aisément.
    En es-tu sûr ???
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    a=range(3)
    orig=[a, a, a]
    copie1=orig
    copie2=orig[:]
    a.append(10)
    print orig
    print copie1
    print copie2
    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]

  10. #10
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Points : 40
    Points
    40
    Par défaut
    Merci encore,
    le but de mon message initial était d'avoir une réponse érudite, ce que j'ai eu, à un problème qui m'a surpris.
    Ce problème je l'ai résumé sous une forme où on voit que, selon le type de variable a, quand on modifie une variable b dans laquelle on croit avoir rangé la valeur de a, si on modifie b, on peut aussi modifier a. Je sais maintenant qu'il faut distinguer les variables selon leur "mutabilité".
    J'ai parlé de variables, ce qui peut heurter des pythonistes avertis.
    Je viens ainsi de tomber sur une page intéressante (j'ai des pb dans mes indentations quand je passe du CLI de Linux à celui de Windows) :

    https://larlet.fr/david/biologeek/ar...stuces-python/

    On y lit, entre autres :
    "Les autres langages ont des "variables"

    Dans de nombreux autres langages, assigner une variable revient à mettre une valeur dans une boîte.
    ...
    Python a des "noms"

    En Python, un "nom" ou "identifiant" est comme une étiquette attachée à un objet
    ."

    Merci encore pour toutes ces réponses que j'apprécie.

  11. #11
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Python est un langage qui est beaucoup enseigné comme premier langage. Il est donc vrai que beaucoup de ressources pédagogiques parlent simplement de variables sans faire la distinction entre les variables mutables et celle non mutables. C'est juste que ce sont des notions un peu plus compliqués, et qu'on les voit plus tard dans l'apprentissage de ce langage.

Discussions similaires

  1. Intégrer un script python dans une page Web
    Par Mysti¢ dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 02/11/2006, 10h20
  2. Réponses: 3
    Dernier message: 26/06/2006, 13h48
  3. Interpreter un script python dans un prog python
    Par romeo9423 dans le forum Général Python
    Réponses: 3
    Dernier message: 01/12/2005, 16h16
  4. Embarque un interpreteur Python dans une appli C++
    Par romeo9423 dans le forum MFC
    Réponses: 1
    Dernier message: 01/12/2005, 10h52

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