compréhension de qlqs fonctions en Python

Messages : 9664

Enregistré le : 30 juil. 2008 16:59

Classe : Dr.-Ing

Re: compréhension de qlqs fonctions en Python

Message par fakbill » 12 août 2020 18:42

Je crois que la vocation de ce site est de répondre aux questions autour de la prépa, questions qui sont le plus souvent posées par les premiers concernés.
Je vous le redis, s'il prends plaisir à "jouer" à coder en python surtout laissez le faire :)
On n'apprend pas un langage dans les livres. On apprend un langage en pratiquant et en se donnant soit même des choses à coder.
Laissez le faire et dites lui de venir nous demander quand il bloque.
Apprendre à poser correctement une question afin d'avoir des réponses claires est qqch qui s'apprend, surtout en informatique. certains postent des bout de code beaucoup trop longs. D'autres postent juste la ligne qui pose pb sans écrire le message d'ereur ou donner le contexte...bref poser une question s'apprend.
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

YS1

Messages : 10

Enregistré le : 06 févr. 2005 11:50

Classe : MPSI, PCSI, MP*, PC*

Re: compréhension de qlqs fonctions en Python

Message par YS1 » 14 août 2020 11:08

fakbill a écrit :
11 août 2020 23:15
Oui !
Enfin non... Ca dépend si le type est mutable ou pas.
Non, ça ne dépend pas et c'est justement l'intérêt de cette présentation : ne pas donner une perception fausse de l'affectation qui conduit ensuite à devoir tordre les choses quand on aborde les objets mutables. L'affectation se comporte de la même façon dans les deux cas ; c'est au niveau de l'objet désigné par la variable, et seulement lui, qu'il peut se passer des choses s'il est mutable.
En clair, si on peut modifier le contenu d'un objet après l'avoir créé alors a=b veut dire que a est un autre nom pour l'objet b. Si on modifie b alors a sera modifié.
C'est ce que l'affectation veut dire dans tous les cas (il faudrait préciser "objet désigné par b"). Seulement bien sûr, quand l'objet n'est pas mutable, l'éventualité qu'il soit modifié tombe à l'eau.
Avec des tuples qui ne sont donc pas modifiables, a=b veut dire 'créé une copie de l'objet b et nomme la a'.
C'est faux. D'abord b n'est pas un objet mais une variable. L'objet, c'est ce que désigne b. Quand on explique l'affectation à quelqu'un il est important de faire la distinction entre une variable et ce qu'elle désigne. Ensuite, la notion de copie d'un objet non mutable n'a pas de sens.

Surtout, c'est vraiment contre productif d'expliquer à quelqu'un que l'affectation provoquerait la création d'une copie quand l'objet en jeu est immuable et qu'au contraire elle n'en fait pas quand l'objet est mutable : ça fait apparaitre ce comportement comme bizarre et arbitraire ; ce n'est pas une façon intelligente de retenir les choses.
C'est une particularité de python cette distinction mutable/non mutable.
Je ne crois pas. D'abord parce qu'en réalité il n'y a pas de différence de comportement de l'affectation entre le cas mutable et non mutable. Ensuite, je pense que ce genre de discussion doit venir dans la plupart des langages dont le modèle mémoire est assez abstrait (rappel : en Python, il n'y a pas d'adresses mémoire).

Messages : 9664

Enregistré le : 30 juil. 2008 16:59

Classe : Dr.-Ing

Re: compréhension de qlqs fonctions en Python

Message par fakbill » 14 août 2020 17:12

YS1 :
Ho oui merde j'avais bu ou quoi??? J'ai expliqué le passage d'argument à une fonction alors qu'on parlait de l'affectation..
b=a sur des tuples fait que b et a ont la même id....bien sûr.

Je me demande comment on leur apprend ce qui se passe non pas quand on fait un bête = mais quand on *passe un argument à une fonction*. Dans ce cas, je ne vois vraiment pas comment expliquer/comprendre les choses autrement pas par la distinction mutable/pas mutable.

La particularité de python c'est justement qu'on n'a pas de notion explicite de pointeurs, de référence, ou de passage par valeur. Ce qui compte dans ce cas c'est le coté mutable ou pas de l'objet passé....et ça c'est souvent compliqué à expliquer aux gens qui viennent du C :)
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Messages : 9664

Enregistré le : 30 juil. 2008 16:59

Classe : Dr.-Ing

Re: compréhension de qlqs fonctions en Python

Message par fakbill » 14 août 2020 17:37

Oui donc les variables sont des étiquettes qui pointent vers les objets. OK ça marche pour l'affectation mais ça n'explique pas tout le passage des arguments à une fonction.
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

YS1

Messages : 10

Enregistré le : 06 févr. 2005 11:50

Classe : MPSI, PCSI, MP*, PC*

Re: compréhension de qlqs fonctions en Python

Message par YS1 » 17 août 2020 13:56

Le passage de paramètre crée, comme une affectation, un alias entre le nom du paramètre effectif dans le contexte appelant et le nom du paramètre formel dans le contexte appelé. À nouveau, il n'y a aucune différence entre le cas d'un objet passé mutable ou non : simplement, la situation d'alias sur un objet immuable peut être ignorée et même passée sous silence.

C'est la même chose en OCaml d'ailleurs.

Les flèches de Pythontutor l'illustrent bien : on a des étiquettes de contextes (frames) différents qui pointent vers le même objet (en Python tous les objets sont dans le tas).

La grande chance, c'est que la quasi totalité des élèves de prépa ne vient pas du C ! Le fait de ne pas avoir de pointeurs n'est pas une particularité de Python : c'est le cas de beaucoup de langages modernes (presque tous ?). À la limite, je dirais même que c'est une particularité de C que d'en avoir !

Messages : 9664

Enregistré le : 30 juil. 2008 16:59

Classe : Dr.-Ing

Re: compréhension de qlqs fonctions en Python

Message par fakbill » 18 août 2020 15:51

simplement, la situation d'alias sur un objet immuable peut être ignorée et même passée sous silence.
J'aime bien le "simplement" mais soit :)
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

YS1

Messages : 10

Enregistré le : 06 févr. 2005 11:50

Classe : MPSI, PCSI, MP*, PC*

Re: compréhension de qlqs fonctions en Python

Message par YS1 » 19 août 2020 10:54

Bah c'est comme quand on est en programmation fonctionnelle pure : le compilo organise la mémoire comme il veut, il partage des bouts de structure quand il veut, vu que de toutes façons, sémantiquement, c'est sans problème.

Répondre