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.
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).
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 können Sie nichtlokal nicht auf Variablen im äußeren Namespace verweisen? Ich wusste nicht lokal, aber ich habe es nicht wirklich benutzt.
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).
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