Seite 1 von 1

NameError: global name '<varname>' is not defined

Verfasst: Samstag 12. August 2006, 00:14
von thonix
Hallo zusammen,

bitte jetzt nicht lachen - ich denke das diese Frage extrem dumm ist, aber sie muss von mir gestellt werden ;)

Ich habe folgende Funktion:

Code: Alles auswählen

	def GetLocalDisks():
		
		line_counter = 0
		for df_line in os.popen('df -l'):
			localdisk[line_counter] = df_line.split( )
			line_counter = line_counter + 1
		
		return localdisk
jedoch bekomme ich immer NameError: global name 'localdisk' is not defined.

Was mache ich den da falsch ?

Thonix

Verfasst: Samstag 12. August 2006, 08:54
von BlackJack
Du versuchst auf den Namen `localdisk` zuzugreifen bevor der an ein Objekt gebunden wurde. Der Interpretierer weiss einfach nicht was `localdisk` sein soll.

Indexe selbst zu verwalten ist in Python übrigens nicht üblich, weil es sich in den meisten Fällen vermeiden lässt und man kürzeren, übersichtlicheren Quelltext bekommt. In Deinem Quelltext erhöhst Du `line_counter` immer von Hand um eins, was der Code macht, lässt sich aber auch als "hänge jedes neue Element hinten an die Liste an" beschreiben, und dazu braucht man keinen Index.

Und wenn man eine Liste in einer Schleife auf diese Weise erstellt, dann lässt sich das oft auch als List Comprehension ausdrücken:

Code: Alles auswählen

def get_local_disks():
    df_pipe = os.popen('df -l')
    result = [df_line.split() for df_line in df_pipe]
    df_pipe.close()
    return result

Verfasst: Sonntag 13. August 2006, 15:35
von thonix
Danke für die Antwort, So geht's ;)

Aber noch eine Frage zur for Schleife die du da gemacht hast.

eins ist mir klar. Das Ergebnis wird an die Liste result angehängt. Woher bekommt aber der df_line.split() seine Daten? Wie funktioniert das.
Haste da vielleicht einen Doku Link für mich?

Verfasst: Sonntag 13. August 2006, 15:45
von murph
also die for-schleife macht immer wieder variablen mit dem wert df_line

Code: Alles auswählen

result = [df_line.split() for df_line in df_pipe]
für jede variable, die for gemacht hat und df_line genannt wurde,
wird die integrierte funktion split() ausgeführt.
dieses ergebnis wird in die liste eingetragen.
klar?

Verfasst: Sonntag 13. August 2006, 15:47
von thonix
Klar ist das die for schleife immer ein df_line produziert.
Was mir nicht ganz klar erscheint - wieso steht der split vor der for schleife ?

Verfasst: Sonntag 13. August 2006, 15:53
von murph
also, wenn ich

Code: Alles auswählen

result = [df_line for df_line in df_pipe]
hätte, würde er eine liste erstellen, die aus den ganzen df_line-variablen, die du erstellst, besteht.
ähnlich wäre

Code: Alles auswählen

df_line_list = []
for df_line in df_pipe:
    df_line_list.append(df_line)
return = df_line_list

nun soll aber "in der for-schleife" noch etwas ausgeführt werden, also es soll eine äquivalente version für

Code: Alles auswählen

df_line_list = []
for df_line in df_pipe:
    new = df_line.split()
    df_line_list.append(new)
return = df_line_list
dafür müsstest du dann

Code: Alles auswählen

result = [df_line.split() for df_line in df_pipe]
schreiben.

Verfasst: Sonntag 13. August 2006, 16:01
von thonix
Hab's geschnallt. Ist ja total cool.
Vielen Dank für deine Ausführung