Résolue

Espaces locaux et portée des variables

# Fonctions # Variables # Python

Du coup ça veut dire qu'on peut avoir plusieurs espaces locaux, chacun étant locaux à une fonction précise ?

def func1():
    a = 2
    print(f"f1 : {a}")
    def func2():
        print(f"f2 : {a}")
    func2()

a = 1
func1()

La on est bien d'accord que j'ai :

  • espace global dans lequel a vaut 1

  • espace local de la fonction func1 dans lequel a vaut 2

  • espace local de la fonction func2 dans lequel a n'existe pas.

C'est ça ?

Gabriel Trouvé

Mentor

Salut,

Tu as presque raison :

  • espace global, 1

  • espace local de func1, 2

  • espace local de func2, 2

Même si a n'est pas défini dans func2, cette dernière a accès à la variable a de la fonction englobante grâce au principe de closure.
Je t'ai mis un lien vers un mentorat sur le sujet. Par contre je ne sais plus si je parle de la closure.

https://www.docstring.fr/accompagnement/mentorat/session/316/

J'ai maté la rediff, hyper interessant.

Par contre je sais pas si j'ai employé les bons termes dans mon message initial. Ce que je voulais dire c'est que dans l'espace local de func2, la variable a n'existe pas.

def func1():
    a = 2
    print(f"locals f1 : {locals()}")
    def func2():
        print(f"locals f2 : {locals()}")
    func2()

a = 1
print(f"locals : {locals()}")
func1()

>>> locals : {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000023013B49EB0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins'="" (built-in)="">, '__file__': 'C:\\Users\\fva\\dev\\learning-python-1\\main.py', '__cached__': None, 'func1': <function 0x0000023013aa3240="" at="" func1="">, 'a': 1}
>>> locals f1 : {'a': 2}
>>> locals f2 : {}

Dans func2, a a quand même une valeur (qui est de 2), mais la variable a en tant que tel n'existe pas l'espace local de func1 (c'est pour ça que le print de locals() ne retourne rien).

On peut quand même print(a) sans erreur parce que Python quitte temporairement l'espace local de func2 pour allez chercher dans l'espace local de func1 s'il ne trouve pas une variable nommé a.

C'est bien ça ?

Gabriel Trouvé

Mentor

Ok je suis d'accord, en fait on parle ici : de la règle LEGB en Python (Local, Enclosing, Global, Built-in)

Tiens, regarde à partir de 35 min et 30 secondes : https://www.docstring.fr/accompagnement/mentorat/session/313/

Un petit exercice intéressant :)

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.