Seite 1 von 1

Button in Jupyter Notebook mit Funktion belegen

Verfasst: Montag 7. August 2017, 16:31
von Apotekarnes
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

Re: Button in Jupyter Notebook mit Funktion belegen

Verfasst: Montag 7. August 2017, 17:08
von __deets__
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.