Rappel

LA PORTÉE
DES VARIABLES

le « scope » : qui voit quoi ?

Une fonction a-t-elle accès aux variables qui sont en dehors d'elle ? Et ce qu'elle crée en dedans, est-ce que ça survit ?

Le réflexe à interroger

taux = 0.15 def calculerTaxe(montant): return montant * taux # ça marche... mais pourquoi ?

La fonction lit taux sans l'avoir reçu en paramètre. Python va le chercher à l'extérieur. Comprendre quand c'est permis, c'est comprendre la portée.

Des cercles emboîtés

PROGRAMME (global) devise = "$" TAUX_TAXE calculerTotal( ) montant taxe je vois bloqué
Du dedans, on VOIT tout ce qui est autour (lecture) Du dehors, on ne voit PAS dans le petit cercle

Règle 1

Lire le dehors : permis

taux = 0.15 def calculerTaxe(montant): return montant * taux # lit taux du dehors
ça fonctionne

Python suit la règle du plus proche au plus large : pas de taux local ? Il va le chercher dans le programme. Possible, mais à utiliser avec prudence : la dépendance reste invisible dans la signature.

Règle 2

Modifier le dehors : bloqué

compteur = 0 def incrementer(): compteur = compteur + 1 incrementer() print(compteur) # toujours 0 !
reste à 0

Dès qu'on assigne un nom dans la fonction, Python en fait une nouvelle variable locale. Le compteur du dedans n'est pas celui du dehors. On ne modifie pas l'extérieur par accident.

Règle 3

Le dedans n'existe pas dehors

def calculerMoyenne(liste): total = sum(liste) return total / len(liste) calculerMoyenne([10, 20]) print(total) # NameError
NameError

total et le paramètre liste n'existent que pendant l'appel. Après le return, ils disparaissent. C'est sain : la fonction ne laisse pas traîner ses variables temporaires.

La porte de secours

Le mot-clé global

Oui, il existe un moyen de forcer la modification du dehors : le mot-clé global. On l'évite presque toujours. Il rend le code imprévisible (une fonction qui change l'état du programme en cachette).

compteur = 0 def incrementer(): global compteur # porte de secours compteur = compteur + 1

À connaître, mais à ne pas prendre comme réflexe

LA RÈGLE D'OR

fonction params return

Ce qui entre passe par les paramètres. Ce qui sort passe par le return.
Une boîte avec une entrée et une sortie, pas une fenêtre ouverte sur tout le programme.

Qui existe où ?

TAUX_TAXE = 0.15 # constante externe devise = "$" # variable externe def calculerTotal(montant): # montant : parametre taxe = montant * TAUX_TAXE # taxe : locale return montant + taxe
La variableCe que c'estÀ l'intérieurÀ l'extérieur
devisevariable externe lecture (pas modif) existe
TAUX_TAXEconstante externe lecture existe
montantparamètre reçu locale n'existe pas
taxevariable locale pendant l'appel disparaît

Le cas des cellules Colab

Surprise fréquente : dans Colab/Jupyter, toutes les cellules partagent le même espace global. Ce qu'une cellule exécute reste vivant pour les cellules suivantes.

Cellule 1 (exécutée)
import numpy as np taux = 0.15
Cellule 2 (plus tard)
# numpy et taux existent # toujours ! pas besoin # de re-importer np.array([taux])

Le piège inverse : si tu effaces une cellule d'import sans relancer, la variable reste en mémoire... jusqu'au prochain « Redémarrer l'environnement », où tout l'espace global est remis à zéro.

EN UN MOT

  • Du dedans, on lit le dehors
  • Du dedans, on ne modifie pas le dehors (sans global, qu'on évite)
  • Le dedans (paramètres, locales) n'existe pas dehors
  • 🌟 Entrée par les paramètres, sortie par le return
cheatsheet/definir-des-fonctions
⤺ Refermer le diaporama