Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

variables modifiables et affectation

5 réponses
Avatar
Couloigner François
Bonjour,

Dans la documentation sur l'utilisation des variables,

http://www.afpy.org/doc/python/2.7/tutorial/classes.html#a-word-about-names-and-objects

il est écrit " plusieurs noms peuvent être utilisés pour faire référence
au même objet ... Ceci est habituellement peu apprécié lors d’un premier
coup d’œil à Python"

Je confirme !

Les listes obéissent aux 2 règles
- on peut modifier individuellement les éléments
- l'égalité entre 1 nom et une liste créé un alias et pas une nouvelle
liste.

la premier est agréable, la second me parait contraignante.
Est-ce que ces 2 points ne peuvent pas aller l'un sans l'autre dans la
mécanique interne de python ?
Pouvez-vous me donner un exemple où l'alias a de l'intérêt ?

5 réponses

Avatar
Francois Lafont
Bonjour,

Le 29/03/2014 18:26, Couloigner François a écrit :

il est écrit " plusieurs noms peuvent être utilisés pour faire référence
au même objet ... Ceci est habituellement peu apprécié lors d’un premier
coup d’œil à Python"

Je confirme !

Les listes obéissent aux 2 règles
- on peut modifier individuellement les éléments



Oui on peut modifier l'état de l'objet :

my_list[2] = 'truc'

ce qui est, en Python, un raccourci (bien pratique) pour dire :

my_list.__setitem__(2, 'truc')

- l'égalité entre 1 nom et une liste créé un alias et pas une nouvelle
liste.



L'expression est un peu ambiguë. Tu veux dire que ceci ne crée pas
pas de nouvel objet liste je suppose :

my_list = ['a', 'b', 'c']
l = my_list

la premier est agréable, la second me parait contraignante.
Est-ce que ces 2 points ne peuvent pas aller l'un sans l'autre dans la
mécanique interne de python ?



Je ne sais pas trop. À vrai dire je ne vois pas trop le lien
entre les 2 points ci-dessus. En revanche, le comportement du
point 2 me semble assez classique. Je me trompe peut-être (je
ne suis pas expert dans le domaine) mais il me semble que dans
la plupart des langages objet, les variables stockent des
références aux objets et non les objets eux-mêmes ce qui
entraîne que, dans la plupart de ces langages, quand on a var1
qui est une variable qui fait référence à un objet donné, après
ceci :

var2 = var1

var2 fait référence au même objet que var1 et aucun objet nouveau
n'est créé.

Il me semble vraiment qu'on retrouve cela dans la plupart des
langages objets pour des listes ou n'importe quoi qui est un
objet d'ailleurs.

Pouvez-vous me donner un exemple où l'alias a de l'intérêt ?



Le seul exemple qui me vient, c'est pour raccourcir un peu le code
et parfois le rendre plus lisible. Imaginons que tu as une liste
« personnels » qui contient un objet « patron » en première position
dans la liste et que cet objet « patron » contient un attribut
« reunions » qui est aussi un objet dont tu veux appliquer plein de
méthodes tout au long d'une portion de code.

Plutôt que d'écrire à plusieurs reprises des trucs comme :

personnels[0].reunions.ajouter(...)

tu peux simplement écrire une bonne fois pour toutes :

patron_reunions = personnels[0].reunions

et ensuite patron_reunions.ajouter(...), patron_reunions.supprimer(...)
etc.

Mes 2 centimes.

--
François Lafont
Avatar
Couloigner François
Le 29/03/2014 19:50, Francois Lafont a écrit :
Bonjour,

Le 29/03/2014 18:26, Couloigner François a écrit :

il est écrit " plusieurs noms peuvent être utilisés pour faire référence
au même objet ... Ceci est habituellement peu apprécié lors d’un premier
coup d’œil à Python"

Je confirme !

Les listes obéissent aux 2 règles
- on peut modifier individuellement les éléments



Oui on peut modifier l'état de l'objet :

my_list[2] = 'truc'

ce qui est, en Python, un raccourci (bien pratique) pour dire :

my_list.__setitem__(2, 'truc')

- l'égalité entre 1 nom et une liste créé un alias et pas une nouvelle
liste.



L'expression est un peu ambiguë. Tu veux dire que ceci ne crée pas
pas de nouvel objet liste je suppose :

my_list = ['a', 'b', 'c']
l = my_list

la premier est agréable, la second me parait contraignante.
Est-ce que ces 2 points ne peuvent pas aller l'un sans l'autre dans la
mécanique interne de python ?



Je ne sais pas trop. À vrai dire je ne vois pas trop le lien
entre les 2 points ci-dessus. En revanche, le comportement du
point 2 me semble assez classique. Je me trompe peut-être (je
ne suis pas expert dans le domaine) mais il me semble que dans
la plupart des langages objet, les variables stockent des
références aux objets et non les objets eux-mêmes ce qui
entraîne que, dans la plupart de ces langages, quand on a var1
qui est une variable qui fait référence à un objet donné, après
ceci :

var2 = var1

var2 fait référence au même objet que var1 et aucun objet nouveau
n'est créé.

Il me semble vraiment qu'on retrouve cela dans la plupart des
langages objets pour des listes ou n'importe quoi qui est un
objet d'ailleurs.

Pouvez-vous me donner un exemple où l'alias a de l'intérêt ?



Le seul exemple qui me vient, c'est pour raccourcir un peu le code
et parfois le rendre plus lisible. Imaginons que tu as une liste
« personnels » qui contient un objet « patron » en première position
dans la liste et que cet objet « patron » contient un attribut
« reunions » qui est aussi un objet dont tu veux appliquer plein de
méthodes tout au long d'une portion de code.

Plutôt que d'écrire à plusieurs reprises des trucs comme :

personnels[0].reunions.ajouter(...)

tu peux simplement écrire une bonne fois pour toutes :

patron_reunions = personnels[0].reunions

et ensuite patron_reunions.ajouter(...), patron_reunions.supprimer(...)
etc.

Mes 2 centimes.




Merci pour ces détails et en particulier l'exemple
Avatar
Damien Wyart
* Couloigner François in fr.comp.lang.python:
Est-ce que ces 2 points ne peuvent pas aller l'un sans l'autre dans la
mécanique interne de python ?
Pouvez-vous me donner un exemple où l'alias a de l'intérêt ?



Quelques éléments de réponse et compléments :
http://software-carpentry.org/v4/python/alias.html
http://nedbatchelder.com/text/names.html

--
DW
Avatar
Damien Wyart
* Couloigner François in fr.comp.lang.python:
> Est-ce que ces 2 points ne peuvent pas aller l'un sans l'autre dans la
> mécanique interne de python ?
> Pouvez-vous me donner un exemple où l'alias a de l'intérêt ?

Quelques éléments de réponse et compléments :
http://software-carpentry.org/v4/python/alias.html
http://nedbatchelder.com/text/names.html



Il y a aussi le chapitre "The Dynamic Typing Interlude" du livre _Learning
Python_ (O'Reilly) qui explique cela très bien. Je t'encourage à acheter
l'ouvrage qui est de très bonne qualité (et connu dans l'écosystème
Python), mais tu peux aussi trouver ce chapitre en ligne sous diverses
formes si tu veux juste le parcourir rapidement.

--
DW
Avatar
Alain Ketterlin
Couloigner François writes:

[...]
http://www.afpy.org/doc/python/2.7/tutorial/classes.html#a-word-about-nam es-and-objects

il est écrit " plusieurs noms peuvent être utilisés pour f aire
référence au même objet ... Ceci est habituellement peu ap précié lors
d’un premier coup d’œil à Python"

Je confirme !

Les listes obéissent aux 2 règles
- on peut modifier individuellement les éléments
- l'égalité entre 1 nom et une liste créé un alias et pas une nouvelle
liste.



Juste un point de terminologie : ce n'est pas une égalité, mais u ne
affectation, ou plutôt en python une liaison (binding). L'égalit é est
une condition, qui s'écrit "==" ou "is" selon ce qu'on veut tester.

la premier est agréable, la second me parait contraignante. Est-ce q ue
ces 2 points ne peuvent pas aller l'un sans l'autre dans la mécanique
interne de python ?



Les deux sont liés. Pour modifier un élément en continuant à utiliser
le même nom, il faut distinguer le nom de l'objet.

D'ailleurs, tout ce que tu dis est vrai aussi pour les ensembles et les
dictionnaires, ainsi que pour toutes les classes que tu créeras
toi-même.

Pouvez-vous me donner un exemple où l'alias a de l'intérêt ?



Le passage de paramètre est un cas typique. Quand tu as :

def mafonction(l):
....

maliste = ...
mafonction(maliste)

pendant l'exécution de l'appel à mafonction() la liste a deux "no ms"
(maliste dans le contexte "principal", et l dans le contexte de
l'appel). Pour des raisons d'efficacité, on ne veut pas dupliquer la
liste.

(Tu me diras que c'est pas grave, on n'est jamais en situation
d'utiliser simultanément "maliste" et "l". Ce n'est pas vrai, à c ause
des générateurs, mais c'est une autre histoire.)

En règle générale, presque tous les (nouveaux) langages util isent ce
mécanisme de liaison nom <-> donnée. Cela rajoute un niveau
d'indirection, donc cela complique un peu la compréhension, mais dans la
pratique c'est tout à fait mineur. Java est un bon exemple aussi, oà ¹
toutes les variables sont des références (sauf pour les types
élémentaires). Techniquement, cela revient à utiliser syst ématiquement
des pointeurs.

Il y a des langages plus précis, où ce genre de choses reste au c hoix du
programmeur : C et C++ sont les exemples les plus connus. Evidemment,
c'est un peu plus compliqué à programmer.

Il y a aussi des langages où on n'a pas le droit de modifier la valeur
d'un objet. Dans ce cas, c'est conceptuellement plus simple, parce qu'il
n'y a aucun problème à avoir plusieurs noms quand la valeur ne pe ut pas
changer.

-- Alain.