Anfängerfrage: Variablen-Scope

04/02/2008 - 11:04 von Bernd Eggink | Report spam
Hallo,

ich lerne gerade Python (komme von Java) und bin über folgendes
Verhalten gestolpert:


def f1():
x = 0

def g():
x = 4711

g()
print "f1: " + str(x)

def f2():
y = [ 0 ]

def g():
y[0] = 4711

g()
print "f2: " + str(y[0])

f1()
f2()


Warum f1() "0" ausgibt, ist mir klar. Warum aber f2() "4711" ausgibt,
nicht. Nach meinem Verstàndnis ist y doch auch eine lokale Variable.
Oder unterscheiden sich in dieser Hinsicht Listen etc. von einfachen
Variablen (es geht auch mit einem Dictionary oder einem Klassenobjekt
y)? Und wenn dem so ist, wo steht das in der Sprachreferenz? Ich habe
sie 3mal rauf und runter gelesen und nichts dazu gefunden.

Gruß,
Bernd

Bernd Eggink
monoped@sudrala.de
http://sudrala.de
 

Lesen sie die antworten

#1 André Malo
04/02/2008 - 11:49 | Warnen spam
* Bernd Eggink wrote:

Hallo,

ich lerne gerade Python (komme von Java) und bin über folgendes
Verhalten gestolpert:


def f1():
x = 0

def g():
x = 4711

g()
print "f1: " + str(x)

def f2():
y = [ 0 ]

def g():
y[0] = 4711

g()
print "f2: " + str(y[0])

f1()
f2()


Warum f1() "0" ausgibt, ist mir klar. Warum aber f2() "4711" ausgibt,
nicht. Nach meinem Verstàndnis ist y doch auch eine lokale Variable.
Oder unterscheiden sich in dieser Hinsicht Listen etc. von einfachen
Variablen (es geht auch mit einem Dictionary oder einem Klassenobjekt
y)? Und wenn dem so ist, wo steht das in der Sprachreferenz? Ich habe
sie 3mal rauf und runter gelesen und nichts dazu gefunden.



Die Frage ist falsch gestellt. Was den wesentlichen Unterschied ausmacht,
sind nicht die Objekttypen, sondern die Art, wie darauf zugegriffen wird.

Im ersten Fall ist es ein Schreibzugriff auf x (in beiden Fàllen), was
jeweils zu einer entsprechenden lokalen Variable führt.

Im zweiten Fall ist es in der inneren Funktion ein Lesezugriff auf das y der
Umgebung (Das ist ein closure) und dann die Ausführung einer Methode auf
dem Objekt (__setitem__).

Ein weiterer Schreibzugriff in g() in f2() führt deshalb zu einem
UnboundLocalError bei der y[0]-Zuweisung (weil die Variable y lokal, aber
noch nicht zugewiesen ist).

In [4]: def f2():
...: y = [0]
...: def g():
...: y[0] = 4711
...: y = [4711]
...: g()

In [5]: f2()

exceptions.UnboundLocalError Traceback (most recent
call last)

/home/nd/<console>

/home/nd/<console> in f2()

/home/nd/<console> in g()

UnboundLocalError: local variable 'y' referenced before assignment

nd
Gefunden auf einer "Webdesigner"-Seite:
Programmierung in HTML, XML, WML, CGI, FLASH <



# André Malo # http://www.perlig.de/ #

Ähnliche fragen