La variable «bar» dans la définition de fonction ci-dessous est interprétée comme une variable globale car il n'y a pas de définition de «bar» dans le bloc fonction.
def foo():
print(bar)
Le code ci-dessous réussit car la variable globale bar
est définie avant d'appeler foo
.
bar = 4
def foo():
print(bar)
foo() # => 4
Vous pouvez voir les variables globales de foo
dans l'attribut co_names
de l'objet de code de foo
.
foo.__code__.co_names # => ('print', 'bar')
À propos, dans le [Document officiel] de Python (https://docs.python.org/3/library/inspect.html), co_names
est écrit comme le nom de la variable locale tuple
, mais (nom de la variable locale) (Hors variables libres) Erreur de nom.
«Bar» dans la définition de fonction ci-dessous est interprété comme une variable locale car «bar» est défini dans le bloc de la fonction.
def foo():
print(bar)
bar = 3
foo.__code__.co_names # => ('print',)
Les variables locales pour foo
peuvent être trouvées dans l'attribut co_varnames
de l'objet de code pour foo
.
foo.__code__.co_varnames # => ('bar',)
Cette interprétation est déterminée lors de la définition de la fonction, donc même s'il y a une «barre» avant la définition de «barre», elle ne sera pas interprétée comme une variable globale, et une erreur se produira comme suit.
bar = 4
def foo():
print(bar)
bar = 3
foo()
# => UnboundLocalError: local variable 'bar' referenced before assignment
En d'autres termes, le nom dans le bloc fonctionnel est déterminé comme étant une variable globale ou une variable locale (ou une variable libre) au stade de la définition de la fonction, et il n'est pas rebondi de la variable globale vers la variable locale au moment de l'affectation au nom.
De plus, les notations inclusives telles que les listes introduisent une nouvelle portée, mais seuls les itérables correspondant au premier «pour» sont interprétés dans la portée externe. L'exemple ci-dessous réussit, en raison des trois «bar» dans la notation d'inclusion de liste, la «barre» la plus à droite est interprétée comme la portée de «foo», c'est-à-dire la variable globale «bar».
bar = range(3)
def foo():
print([bar for bar in bar])
foo() # => [0, 1, 2]
Recommended Posts