Button in Jupyter Notebook mit Funktion belegen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Apotekarnes
User
Beiträge: 18
Registriert: Mittwoch 21. September 2011, 10:02

Hallo allerseits,

ich habe ein Jupyter Notebook angelegt:

Code: Alles auswählen

from IPython.html import widgets
from IPython.display import display

current = (10, 10)

def function(b):
    
    print(current)
    first = current[0]
    second = current[1]
    current=(first-1, second)
    print(current)
   
btn = widgets.Button(description="<left<")
btn.on_click(function)
display(btn)

Beim Click auf den Button kommt folgende Fehlermeldung:


---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-70-090f1afe514c> in left(c)
8
9 def left(c):
---> 10 print(current)
11 first = current[0]
12 second = current[1]

UnboundLocalError: local variable 'current' referenced before assignment


Wenn ich in der Funktion NUR printe, kommt kein Fehler:

Code: Alles auswählen

from IPython.html import widgets
from IPython.display import display

current = (10, 10)

def function(b):
    
    print(current)
   
btn = widgets.Button(description="<left<")
btn.on_click(function)
display(btn)

Output:

(10, 10)

Wo liegt das Problem im ersten Fall?

Gelten für Funktionen, die Buttons zugewiesen werden, besondere Regeln?

Mein Ziel ist es, per Button-Click eine Variable zu inkrementieren/dekrementieren.

Ich hoffe, jemand kann helfen.

Vielen Dank,

Apotekarnes
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem liegt daran, dass du globalen Zustand veraendern moechtest - das aber nicht explizit sagst.

Python hat (manche sagen leider) keinen Weg, Namen explizit einzufuehren wie zB JavaScript:

Code: Alles auswählen

var x = 10;
Stattdessen stehen "nur" irgendwelche Zuweisungen im Raum.

Code: Alles auswählen

x = 10
Daraus macht Python dann eine Regel die sagt "wenn ein Name links von einem Gleichzeichen auftaucht, dann mache ich das zu einer lokalen Variable".

Und genau das tust du: du sagst "current = ..." - und damit ist current fuer Python lokal. Dein print kommt aber davor, und das kracht dann.

Du musst um deinen konkreten Code zum laufen zu bringen erklaeren, dass current eine globale Variabel ist - mit dem global-statement:

Code: Alles auswählen

global current
print(current)
current = 10
Zu globalen Variablen ist hier schon 10000de male etwas gesagt worden - vermeide sie, wenn es moeglich ist.
Antworten