Non local (désolé de ne pas pouvoir expliquer) auquel les débutants en Python (élèves du premier cycle du secondaire) étaient dépendants

Contexte

L'élève K (deuxième apparition) n'a pas bougé comme prévu et s'est mis à pleurer. Je l'ai réparé, mais il y avait encore un brouillard à propos du non local. Je vais le laisser car la brume a disparu.

Programme qui ne fonctionne pas

Essayez de découvrir quelle en est la cause.

Programme qui ne fonctionne pas


import tkinter as tk

count = 0

def dispLabel():
    count = count + 1
    lbl.configure(text = str(count) + "Pressé deux fois")


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

lbl = tk.Label(text="Bouton de comptage")
btn = tk.Button(text="presse", command = dispLabel)

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

Lorsque le bouton est affiché et que j'appuie sur le bouton, j'obtiens une erreur.

Résultat d'exécution


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\document\python\lessen_tk.py", line 6, in dispLabel     
    count = count + 1
UnboundLocalError: local variable 'count' referenced before assignment

C'est une erreur fondamentale que vous faites une erreur si vous ne comprenez pas la portée et les variables locales.

Je veux incrémenter le nombre global dans dispLabel (), mais s'il y a une valeur assignée à count dans dispLabel (), count sera reconnu comme une variable locale et je ne pourrai pas faire référence à la variable globale ( Si vous n'affectez pas à compter, vous pouvez vous référer à global.) Par conséquent, si vous faites référence à une valeur, vous obtiendrez une erreur car c'est avant que la valeur ne soit attribuée (voir le bonus pour plus de détails).

Essayez de réparer

C'est aussi Darui à expliquer, j'ai donc jeté un coup d'œil à l'exemple du tutoriel Python et leur ai fait comprendre la loi.

Exemple de tutoriel Python

Exemple de didacticiel


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)

Monsieur K qui a compris que les variables de la fonction sont traitées différemment de l'extérieur, J'ai copié le didacticiel et je l'ai corrigé comme suit.

amendement


def dispLabel():
    nonlocal count
    count = count + 1
    lbl.configure(text = str(count) + "Pressé deux fois")

Résultat d'exécution

Résultat d'exécution


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

Mr. T: "Vous pouvez ajouter non local ou global, mais vous ne pouvez pas." Moi: Qu'est-ce que c'est? ?? "Si vous le définissez sur le décompte global, cela fonctionnera. Je ne sais pas." Et rendez le thé boueux. (Je suis désolé, je ne peux pas expliquer) Bien sûr, cela a fonctionné lorsque je l'ai rendu mondial.

Pourquoi pas non local?

Pourquoi non local ne vous permet-il pas de faire référence à des variables dans l'espace de noms externe? Je connaissais le non local, mais je ne l'ai pas vraiment utilisé.

documentation python

L'instruction nonlocal garantit que les identificateurs répertoriés font référence à la variable précédemment liée dans la portée externe, à l'exclusion de global. Ceci est important car le comportement par défaut des liaisons recherche d'abord l'espace de noms local. Cette instruction permet au code à l'intérieur de relier des variables en dehors de la portée locale autre que la portée globale (module).

Les noms répertoriés dans l'instruction non locale, contrairement aux noms répertoriés dans l'instruction globale, doivent faire référence à une liaison qui existe déjà dans la portée externe (le choix de la portée dans laquelle la nouvelle liaison doit être créée est ambigu. Ne peut être exclu).

Résumé de la cause

prime

Si vous lisez simplement le nombre de variables globales dans une fonction sans déclarer global, vous n'avez pas besoin de déclarer global. Cependant, s'il y a une affectation à compter, count sera reconnu comme une variable locale. Notez que cela semble être jugé par l'existence de la ligne count =, et non par l'exécution de count =. Même dans le cas suivant, count est reconnu comme une variable locale et une exception de référencée avant l'affectation se produit sur la ligne de a = (je ne l'ai pas compris, alors je l'ai essayé et c'était comme ça).

def dispLabel():
    a = count + 1
    if False:
        count=a
    lbl.configure(text = str(count) + "Pressé deux fois")

Recommended Posts

Non local (désolé de ne pas pouvoir expliquer) auquel les débutants en Python (élèves du premier cycle du secondaire) étaient dépendants
[Python] Les lycéens d'Ikiri expliqueront la blockchain aux débutants en 10 minutes! !! !!
Méthodes WebDriver que les débutants de Python recherchaient en premier
Modèle SIR que même les élèves du premier cycle du secondaire peuvent comprendre
[Python] J'ai essayé d'expliquer des mots difficiles à comprendre pour les débutants d'une manière facile à comprendre.
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
J'étais accro à ne pas pouvoir utiliser Markdown pour la description longue de pypi