Nicht lokal (Entschuldigung, dass ich es nicht erklären konnte), von dem Python-Anfänger (Schüler der Mittelstufe) abhängig waren

Hintergrund

Der Schüler der Mittelstufe K (zweiter Auftritt) bewegte sich nicht wie erwartet und fing an zu weinen. Ich habe es behoben, aber es gab immer noch einen Dunst über nicht lokal. Ich werde es verlassen, weil der Dunst verschwunden ist.

Programm, das nicht funktioniert

Versuchen Sie herauszufinden, was die Ursache ist.

Programm, das nicht funktioniert


import tkinter as tk

count = 0

def dispLabel():
    count = count + 1
    lbl.configure(text = str(count) + "Zweimal gedrückt")


root = tk.Tk()
root.geometry("300x80")

lbl = tk.Label(text="Zählschaltfläche")
btn = tk.Button(text="Drücken Sie", command = dispLabel)

lbl.pack()
btn.pack()
tk.mainloop()

Wenn die Schaltfläche angezeigt wird und ich die Taste drücke, wird eine Fehlermeldung angezeigt.

Ausführungsergebnis


Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\masa\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "c:\Users\masa\OneDrive\Dokument\python\lessen_tk.py", line 6, in dispLabel     
    count = count + 1
UnboundLocalError: local variable 'count' referenced before assignment

Es ist ein grundlegender Fehler, dass Sie einen Fehler machen, wenn Sie den Bereich und die lokalen Variablen nicht verstehen.

Ich möchte die globale Anzahl in dispLabel () erhöhen, aber wenn in dispLabel () ein Wert für count zugewiesen ist, wird count als lokale Variable erkannt und ich kann nicht auf die globale Variable verweisen ( Wenn Sie nicht der Anzahl zuweisen, können Sie sich auf global beziehen.) Wenn Sie sich also auf einen Wert beziehen, wird eine Fehlermeldung angezeigt, da dies vor der Zuweisung des Werts liegt (Einzelheiten finden Sie im Bonus).

Versuche es zu reparieren

Es ist auch Darui zu erklären, also habe ich mir das Beispiel des Python-Tutorials angesehen und sie das Gesetz verstehen lassen.

Beispiel für ein Python-Tutorial

Tutorial-Beispiel


def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

Herr K, der verstanden hat, dass die Variablen in der Funktion von außen anders behandelt werden, Ich habe das Tutorial kopiert und wie folgt behoben.

Änderung


def dispLabel():
    nonlocal count
    count = count + 1
    lbl.configure(text = str(count) + "Zweimal gedrückt")

Ausführungsergebnis

Ausführungsergebnis


  File "c:\Users\masa\OneDrive\Dokument\python\lessen_tk.py", line 6
    nonlocal count
    ^
SyntaxError: no binding for nonlocal 'count' found

Herr T: "Sie können nicht lokal oder global hinzufügen, aber Sie können nicht." Ich: Was ist das? ?? "Wenn Sie es auf globale Anzahl setzen, wird es funktionieren. Ich weiß es nicht." Und mach den Tee schlammig. (Es tut mir leid, dass ich es nicht erklären kann) Natürlich hat es funktioniert, als ich es global gemacht habe.

Warum nicht nicht lokal?

Warum können Sie nichtlokal nicht auf Variablen im äußeren Namespace verweisen? Ich wusste nicht lokal, aber ich habe es nicht wirklich benutzt.

Python-Dokumentation

Die nichtlokale Anweisung stellt sicher, dass die aufgelisteten Bezeichner auf die zuvor gebundene Variable im äußeren Bereich verweisen, ausgenommen global. Dies ist wichtig, da das Standardverhalten von Bindungen zuerst den lokalen Namespace durchsucht. Diese Anweisung ermöglicht es dem Code innerhalb, Variablen außerhalb des lokalen Bereichs außer dem globalen (Modul-) Bereich neu zu binden.

Die in der nichtlokalen Anweisung aufgeführten Namen müssen sich im Gegensatz zu den in der globalen Anweisung aufgeführten Namen auf eine Bindung beziehen, die bereits im äußeren Bereich vorhanden ist (die Auswahl des Bereichs, in dem die neue Bindung erstellt werden soll, ist nicht eindeutig. Kann nicht ausgeschlossen werden).

Ursachenübersicht

Bonus

Wenn Sie nur die Anzahl der globalen Variablen in einer Funktion lesen, ohne global zu deklarieren, müssen Sie global nicht deklarieren. Wenn jedoch eine Zuweisung zu zählen ist, wird count als lokale Variable erkannt. Beachten Sie, dass es anscheinend an der Existenz der Zeile count = gemessen wird, nicht daran, ob count = ausgeführt wurde. Selbst im folgenden Fall wird count als lokale Variable erkannt und eine Ausnahme von referenziert, bevor die Zuweisung in der Zeile a = erfolgt (ich habe es nicht verstanden, also habe ich es versucht und es war so).

def dispLabel():
    a = count + 1
    if False:
        count=a
    lbl.configure(text = str(count) + "Zweimal gedrückt")

Recommended Posts

Nicht lokal (Entschuldigung, dass ich es nicht erklären konnte), von dem Python-Anfänger (Schüler der Mittelstufe) abhängig waren
[Python] Ikiri-Schüler erklären Anfängern in 10 Minuten die Blockchain! !! !!
WebDriver-Methoden, nach denen Python-Anfänger zuerst gesucht haben
SIR-Modell, das auch Schüler der Mittelstufe verstehen können
[Python] Ich habe versucht, Wörter, die für Anfänger schwer zu verstehen sind, auf leicht verständliche Weise zu erklären.
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
Ich war süchtig danach, Markdown nicht für die lange Beschreibung von Pypi verwenden zu können