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

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.
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

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

Beitragvon thonix » Samstag 12. August 2006, 00:14

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
BlackJack

Beitragvon BlackJack » Samstag 12. August 2006, 08:54

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
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

Beitragvon thonix » Sonntag 13. August 2006, 15:35

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?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Sonntag 13. August 2006, 15:45

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?
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

Beitragvon thonix » Sonntag 13. August 2006, 15:47

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 ?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Sonntag 13. August 2006, 15:53

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.
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

Beitragvon thonix » Sonntag 13. August 2006, 16:01

Hab's geschnallt. Ist ja total cool.
Vielen Dank für deine Ausführung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder