[PYTHON] Wenn eine lokale Variable mit demselben Namen wie die globale Variable in der Funktion definiert ist

Die Variable "bar" in der folgenden Funktionsdefinition wird als globale Variable interpretiert, da der Funktionsblock keine Definition von "bar" enthält.

def foo():
    print(bar)

Der folgende Code ist erfolgreich, da die globale Variable "bar" vor dem Aufruf von "foo" definiert wird.

bar = 4

def foo():
    print(bar)

foo()  # => 4

Sie können die globalen Variablen von "foo" im Attribut "co_names" des Codeobjekts von "foo" sehen.

foo.__code__.co_names  # => ('print', 'bar')

Übrigens wird in Pythons Offizielles Dokument "co_names" als lokaler Variablenname "tuple" geschrieben, aber (lokaler Variablenname) (Ohne freie Variablen) Namensfehler.

Bar in der folgenden Funktionsdefinition wird als lokale Variable interpretiert, da bar im Block der Funktion definiert ist.

def foo():
    print(bar)
    bar = 3
foo.__code__.co_names  # => ('print',)

Lokale Variablen für foo finden Sie im Attribut co_varnames des Codeobjekts für foo.

foo.__code__.co_varnames  # => ('bar',)

Diese Interpretation wird bestimmt, wenn die Funktionsdefinition vorgenommen wird. Selbst wenn vor der Definition von "Balken" ein "Balken" steht, wird dieser nicht als globale Variable interpretiert, und es tritt ein Fehler wie folgt auf.

bar = 4

def foo():
    print(bar)
    bar = 3

foo()  
# => UnboundLocalError: local variable 'bar' referenced before assignment

Mit anderen Worten, der Name im Funktionsblock wird in der Phase der Funktionsdefinition als globale Variable oder lokale Variable (oder freie Variable) bestimmt und zum Zeitpunkt der Zuweisung zum Namen nicht von der globalen Variablen zur lokalen Variablen zurückgebunden.

Darüber hinaus führen inklusive Notationen wie Listen einen neuen Bereich ein, aber nur die Iterablen, die dem ersten "für" entsprechen, werden im äußeren Bereich interpretiert. Das folgende Beispiel ist erfolgreich. Aufgrund der drei "Balken" in der Listeneinschlussnotation wird der am weitesten rechts stehende "Balken" als der Bereich von "foo" interpretiert, dh der globalen Variablen "Balken".

bar = range(3)

def foo():
    print([bar for bar in bar])

foo()  # => [0, 1, 2]

Recommended Posts

Wenn eine lokale Variable mit demselben Namen wie die globale Variable in der Funktion definiert ist
Wenn der Variablenname mit dem Devaga-Befehl in pdb in Konflikt steht
Ruft den Variablennamen der Variablen als Zeichenfolge ab.
Laden Sie das gleichnamige Modul an einer anderen Stelle
Ein Hinweis beim Überprüfen, ob der angegebene Schlüssel im definierten Wörterbuch mit Python vorhanden ist
Rufen Sie den Klassennamen ab, in dem die Methode im Dekorator definiert ist
Der Wert von meta beim Angeben einer Funktion ohne Rückgabewert mit Dask dataframe gilt
Beim Lesen eines Bildes mit SimpleITK tritt ein Problem auf, wenn sich Japanisch im Pfad befindet
Eine Geschichte, nach der ich süchtig war, als ich in Go nil als Funktionsargument angab
Vorsichtsmaßnahmen beim Erstellen eines zweidimensionalen Arrays mit denselben Werten
Benennen Sie den Knoten mit demselben Namen, der während der Arbeit gefunden wurde, automatisch um
Problemumgehung für sys.argv wird nicht übergeben, wenn ein Python-Skript mit nur dem Dateinamen unter Python2.7 unter Windows ausgeführt wird
[Python] Ausführungszeit, wenn eine Funktion in einen Wörterbuchwert eingegeben wird
Eine Geschichte, wenn ein Verzeichnis mit dem Befehl django-admin start project in einer virtuellen Umgebung mit Pipenv fehlerhaft ist
Memorandum (Namen nur Personen mit demselben Nachnamen in der Liste hinzufügen)
Ersetzen Sie den Verzeichnisnamen und den Dateinamen im Verzeichnis zusammen mit einem Linux-Befehl.
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
Verhalten bei der Rückkehr in den with-Block
Vorsichtsmaßnahmen beim Beizen einer Funktion in Python
[Python] Ruft den Variablennamen mit str ab
Wenn das Ziel Ubuntu 16.04 in Ansible ist
Suchen Sie in Google Earth nach einem Gebäude, das der Höhe von Shin Godzilla entspricht
Drehen Sie in Python mehrere Listen mit for-Anweisung gleichzeitig
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Greifen Sie auf Dateien im selben Verzeichnis wie die ausführbare Datei zu
(Hinweis) Importieren von Excel mit demselben Spaltennamen
Holen Sie sich den Aufrufer einer Funktion in Python
Erkennen Sie Ordner mit demselben Bild in ImageHash
[Lösung] Wenn "0001" in die Zeichenfolgenspalte in sqlite3 eingefügt wird, wird es als "1" eingegeben.
Wenn die Variable, die Sie in Matplotlib als hochgestellt verwenden möchten, aus zwei oder mehr Zeichen besteht
[Einführung in Python] Was ist das wichtige "if __name__ == '__ main__':" beim Umgang mit Modulen?
Ich habe nach dem Problem der Tribonatch-Sequenz in C ++ und der Anzahl der Funktionsaufrufe beim Schreiben mit einer Wiederholungsfunktion gefragt (Python ist ebenfalls verfügbar).
[Python] Wenn Sie eine Datei mit demselben Namen wie das zu importierende Modul erstellen, tritt ein Attributfehler auf.
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
Dies ist ein Beispiel für eine Funktionsanwendung im Datenrahmen.
So erhalten Sie den Variablennamen selbst in Python
Wenn das ausgewählte Objekt in bpy.context.selected_objects nicht zurückgegeben wird
Abrufen des Dateinamens in einem Ordner mithilfe von glob
Einbetten in datetime, wenn nur die Zeit bekannt ist
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
Ein einfacher Unterschied bei der Übergabe eines Zeigers als Funktionsargument
Bestimmen Sie, ob im Objekt ein Attribut definiert ist
Erstellen einer Liste, wenn die Nomenklatur für einen bestimmten Zeitraum gültig ist
Was bedeutet das letzte () in einer Funktion in Python?
Was tun, wenn ein nicht in pom.xml definiertes Glas zu einem fehlenden Artefakt wird?
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Wenn sich eine Zeichenfolge einer bestimmten Reihe im Schlüssel des Wörterbuchs befindet, wird die Zeichenfolge in den Wert des Wörterbuchs konvertiert.
Erstellen Sie einen Test mit dem Hilfswerkzeug [Selen-Katalon-Rekorder], was bei der Verwendung von Selen praktisch ist.