Questions de synthèse de l’activité et compléments d’informationsQuelles différences faites vous entre une variable utilisée dans la partie principale du script et une variable locale à une fonction ?Réponse attendue - localisation dans l’espace mémoire,
- « durée de vie » de la variable,
- accessibilité par les instructions ( de la fonction # du script principal ), …
IMPORTANT : A propos du « nom de la variable », l’activité n’aborde pas le problème de la confusion engendrée dans le langage Python par des variables du script principal accessibles depuis une fonction sans utiliser le mot clé global. (voir le script joint local_global_implicite.py)
- soit il n’y a pas d’affectation et la variable est accessible en lecture seule (équivalent à un passage par valeur)
- soit il y a affectation et la fonction utilise une variable locale qui porte le même nom que la variable du script principal mais qui n’est pas dans le même espace mémoire ! (variable locale) A CONDITION qu’aucune instruction de la fonction n’ait utilisé accéder à cette variable en lecture avant affectation ( voir f2( ) du script cité ci-dessus)
Ce point pourrait faire l’objet d’une autre fiche navette dans une autre activité d’approfondissement ou de pédagogique individualisée.
Quelle est la signification « durée de vie » d’une variable d’un point de vue de la mémoire allouée ?Réponse attendueSi cette variable est déclarée dans le script principale elle sera disponible jusqu’à la fin du script principal. Si cette variable a été déclarée dans une fonction, l’espace mémoire est libéré à la fin de l’exécution du script de la fonction. Une variable alpha « existe » dès la première instruction alpha = … . Cette instruction signifie que l’interpréteur Python va utiliser la référence alpha et l’associer à une information en mémoire.
- Soit cette information est déjà en mémoire , alors il n’y a pas d’utilisation supplémentaire de mémoire, alpha fera référence à l’information déjà disponible. Il peut donc y avoir plusieurs variables qui référencent la même information en mémoire.
- Soit cette information n’est pas en mémoire et l’interpréteur va alors utiliser un nouvel espace mémoire pour y placer l’information puis référencer cet espace avec le nom de la variable : alpha.
Nous n’aborderons pas ici les instructions qui permettent de libérer des espaces mémoire alloués. Cette opération est automatisé sous Python : garbage collector =>
http://www.mypycode.com/fr/Python/1001000649.htmlLà aussi, le type de l’information et donc le type de la variable va impliquer un mode de fonctionnement différent que l’on retrouve selon que l’affectation se fasse par valeur (int, str, …) ou par référence ( list, dict, …) voire en fonction de l’information en elle même.
En effet, Python stocke par défaut les valeurs de -5 à 256 car ces valeurs sont très régulièrement utilisées. Donc nul besoin de réserver de l’espace mémoire, il suffit d’y faire référence.
A titre informatif : le nom d’une liste ne fait pas référence à l’adresse où est stocké l’élément d’indice 0 mais fait référence à l’adresse mémoire où est placée l’instance de class list avec tous les attributs propres à cette instance de classe ( longueur, …). Le premier élément de la liste est placé ailleurs en mémoire. Tout dépend de sa nature int, str, tuple, ...
Peut-on accéder aux variables locales à une fonction depuis la partie principale du script ?Réponse attenduePar principe, le script principal est suspendu, pendant le temps d’exécution de la fonction. celui-ci attend le retour de la « fiche navette ».
Le script principal ne peut accéder qu’à l’information renvoyée par l’instruction return …
Soit cette instruction transmet une valeur, soit une référence à une adresse où est placée l’information renvoyée par la fonction mais elle ne peut être récupérée que si celle-ci est référencée par une variable au retour de la fonction : ma_variable = fonction ( … ).
Peut-on modifier l’information référencée par une variable du script principal depuis une fonction ?Réponse attendueOui, depuis une fonction on peut modifier l’information référencée par une variable du script principal à condition que le mot clé global soit utilisé dans la fonction et que les variables portent le même nom dans le script principal et le script de la fonction puisqu’il s’agit alors de la même variable (référence).
Lorsqu’on passe une information référencée par une variable dans la script principal, à une variable déclarée dans les arguments de la fonction, ces deux variables doivent-elles avoir le même nom ?Exemple : ici peut-on utiliser la variable rayon dans le script principal et r dans le script de la fonction ?
Réponse attendueNon les variables peuvent avoir des noms différents puisque les deux espaces mémoire sont différents.
En revanche l’ordre des arguments est important si le nom de la variable local n’est pas cité dans l’appel.
Ici, l’appel volume_cylindre ( 5, 2 ) aurait le même effet que volume_cylindre ( h = 2, r = 5 )
Réaliser la fiche navette qui correspondrait à l’appel de la fonction surface_carre ( …) ci dessus.