Zugriffsproblem auf Variable

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
Benutzeravatar
Empi
User
Beiträge: 26
Registriert: Montag 29. März 2010, 14:05

Dienstag 17. August 2010, 07:28

Hallo.

Wieso funktioniert

Code: Alles auswählen

VERSION = '1.0_SL1'
ns = 'test'

def __test():
    print ns
    print VERSION
    #ns = 'f'

if __name__ == "__main__":
    print VERSION
    print ns

    __test()
aber

Code: Alles auswählen

VERSION = '1.0_SL1'
ns = 'test'

def __test():
    print ns
    print VERSION
    ns = 'f'

if __name__ == "__main__":
    print VERSION
    print ns

    __test()
wirft eine Exception?

1.0_SL1
test
Traceback (most recent call last):
File "C:\Users\Empi\Desktop\CDB_LoadBalancing\src\test.py", line 15, in <module>
__test()
File "C:\Users\Empi\Desktop\CDB_LoadBalancing\src\test.py", line 7, in __test
print ns
UnboundLocalError: local variable 'ns' referenced before assignment
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Dienstag 17. August 2010, 07:32

Durch die Zuweisung wird die Variable eine lokale Variable und du greifst vor ihrer Zuweisung auf sie zu => Fehler. Wenn du auf eine globale Variable schreibend zugreifen möchtest, musst du sie erst mit `gobal` deklarieren.

Code: Alles auswählen

def test():
    global ns
    ...
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Dienstag 17. August 2010, 07:33

Funktionen haben einen eigenen Sichtbereich. Wenn ein Name dort nicht gefunden wird, wird im nächsthöheren Sichtbereich geguckt - in deinem Fall auf Modulebene. Wenn du den selben Namen innerhalb der Funktion aber in irgendeiner Form bindest, existiert er innerhalb des eigenen Sichtbereichs und es wird nicht mehr "nach Außen" geguckt. Und dann stellt er halt fest, daß dem Namen noch nichts zugewiesen wurde.

Bleibt noch Hinzuzufügen, daß es ganz ganz schlechter Stil ist, auf Variablen zuzugreifen, die nicht als Parameter in eine Funktion übergeben wurden. Einzige Ausnahme sind Modulweite Konstanten, aber die sollten naturgemäß nicht mehr verändert werden.
Benutzeravatar
Empi
User
Beiträge: 26
Registriert: Montag 29. März 2010, 14:05

Dienstag 17. August 2010, 07:47

Ihr seid echt schnell!
Besten Dank für eure Hilfe!
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 17. August 2010, 08:40

Hallo.

Du möchtest Rückgabewerte verwenden, für genau solche Fälle sind sie gedacht. Außerdem willst du keine Funktionen die mit zwei Unterstrichen beginnen ;-)

Sebastian
Das Leben ist wie ein Tennisball.
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Dienstag 17. August 2010, 11:52

Hi Empi

war auch ein "Problem" für mich
http://www.python-forum.de/viewtopic.php?f=1&t=21239

alpha
Benutzeravatar
Empi
User
Beiträge: 26
Registriert: Montag 29. März 2010, 14:05

Dienstag 17. August 2010, 12:01

alpha hat geschrieben:Hi Empi
war auch ein "Problem" für mich
http://www.python-forum.de/viewtopic.php?f=1&t=21239
alpha
Bin bisher einfach noch nicht auf eine solche Anforderung gestoßen. Man lernt halt nie aus :oops:
EyDu hat geschrieben:Hallo.
Du möchtest Rückgabewerte verwenden, für genau solche Fälle sind sie gedacht. Außerdem willst du keine Funktionen die mit zwei Unterstrichen beginnen ;-)
Sebastian
Mein Programm macht das schon mit Rückgabewerten und Funktionen - wollte nur "schnell mal was testen" und war echt über das Ergebnis verwundert.
Das mit dem Namen ist schon wirklich absicht, aber das sollten wir an anderer Stelle diskutieren :)
Antworten