[PYTHON] Lorsqu'une variable locale portant le même nom que la variable globale est définie dans la fonction

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

Lorsqu'une variable locale portant le même nom que la variable globale est définie dans la fonction
Lorsque le nom de la variable entre en conflit avec la commande Devaga dans pdb
Obtenez le nom de la variable sous forme de chaîne de caractères.
Chargez le module du même nom dans un autre emplacement
Une note lors de la vérification si la clé spécifiée existe dans le dictionnaire défini avec python
Récupère le nom de la classe où la méthode est définie dans le décorateur
La valeur de meta lors de la spécification d'une fonction sans valeur de retour avec Dask dataframe s'applique
Lors de la lecture d'une image avec SimpleITK, il y a un problème s'il y a du japonais dans le chemin
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
Précautions lors de la création d'un tableau à deux dimensions avec toutes les mêmes valeurs
Renommez automatiquement le nœud avec le même nom trouvé en travaillant
Solution de contournement pour sys.argv non transmise lors de l'exécution d'un script Python avec uniquement le nom de fichier sur Python2.7 sous Windows
[Python] Temps d'exécution lorsqu'une fonction est saisie dans une valeur de dictionnaire
Une histoire quand un répertoire est bogué avec la commande django-admin start project dans un environnement virtuel utilisant Pipenv
Mémorandum (Ajouter le nom uniquement aux personnes portant le même nom de famille dans la liste)
Remplacez le nom du répertoire et le nom du fichier dans le répertoire par une commande Linux.
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
Comportement lors du retour dans le bloc with
Précautions lors du décapage d'une fonction en python
[Python] Récupère le nom de la variable avec str
Lorsque la cible est Ubuntu 16.04 dans Ansible
Trouvez un bâtiment de la même hauteur que Shin Godzilla sur Google Earth
Transformez plusieurs listes avec l'instruction for en même temps en Python
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
[Python] Récupérez les fichiers dans le dossier avec Python
Accéder aux fichiers dans le même répertoire que le fichier exécutable
(Remarque) Importation d'Excel avec le même nom de colonne
Récupérer l'appelant d'une fonction en Python
Détecter les dossiers avec la même image dans ImageHash
[Solution] Lorsque "0001" est inséré dans la colonne de chaîne de sqlite3, il est entré comme "1".
Lorsque la variable que vous souhaitez utiliser comme exposant dans matplotlib comporte deux caractères ou plus
[Introduction à Python] Quel est l'important "if __name__ == '__ main__':" lorsqu'il s'agit de modules?
J'ai posé le problème de la séquence tribonatch en C ++ et le nombre d'appels de fonction lors de l'écriture avec une fonction de récurrence (python est également disponible)
[Python] Si vous créez un fichier avec le même nom que le module à importer, une erreur d'attribut se produira.
Vérifiez si la chaîne est un nombre en python
Ceci est un exemple d'application de fonction dans dataframe.
Comment obtenir le nom de la variable lui-même en python
Lorsque l'objet sélectionné dans bpy.context.selected_objects n'est pas renvoyé
Obtenir le nom de fichier dans un dossier à l'aide de glob
Incorporation dans datetime lorsque seule l'heure est connue
Que contient cette variable (lorsque le script Python est en cours d'exécution)
Une simple différence lors du passage d'un pointeur comme argument de fonction
Déterminer si un attribut est défini dans l'objet
Créer une liste lorsque la nomenclature est pour une certaine période de temps
Que signifie le dernier () dans une fonction en Python?
Que faire lorsqu'un artefact manquant se produit dans un fichier jar qui n'est pas défini dans pom.xml
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
Lorsqu'une chaîne de caractères d'une certaine série se trouve dans la clé du dictionnaire, la chaîne de caractères est convertie en valeur du dictionnaire.
Créez un test avec l'outil auxiliaire [enregistreur de katalon de sélénium], ce qui est pratique lors de l'utilisation du sélénium.