IndexError: pop from empty list

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
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Hi, sorry wegen des vielen postens-das Problem loest sich einfach nicht auf- hier ein simplifizierter code- die listen sehen anders aus, alles hat funktioniert bis ich mit pop angefangen habe und ich habe auch schon vorher mit Listen gearbeitet.
Ich habe mein gesamtes Programm im Top-Down-Design geschrieben, doch daran haengts sichs gerade auf. Wenn die Listen in der make-Funktion stehen, gibt mir CSS(GUI), das meinen Pythoncode laeuft keinen error (IndexError: pop from empty list), sobald es in der anderen Funktion(was aber unvermeidbar ist ohne das Programm voellig umzuschreiben) steht, schon. Die Listen sind augenscheinlich nicht leer. Ich werde daraus einfach nicht schlau.-.-
Wieso ist das so

Code: Alles auswählen

def main():
    cavlist, factor = readin()
    make(cavlist, factor)
def readin():
    cavlist = [1,2,3,4,5,6]
    factor = [0.5,0.7,0.8,0.9]
    return cavlist, factor
def make(cavlist, factor):
    cavlist1, factor1 = cavlist.pop(0), factor.pop(0)
    print cavlist1, factor1
if __name__ == '__main__': main()
Vielen Dank im Vorraus, nach mehreren Stunden bin ich langsam am Verzweifeln.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo,

ganz offensichtlich handelt es sich doch um eine leere Liste. Gib die Liste mal mit print aus, bevor du pop auf ihr ausführst.

Außerdem ist der Rückgabewert von make sehr zweifelhaft. pop liefert nämlich None zurück und nicht die neue Liste. Das Ergebnis von make ist also immer (None, None).

Auch ist es reichlich sinnlos ein Beispiel zu zeigen, welches offensichtlich den Fehler nicht produziert. Du musst dein Programm so weit kürzes, dass der Fehler erhalten bleibt und der Code minimal ist. Meistens findet man den Fehler dann schon von selbst.
Das Leben ist wie ein Tennisball.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Die Liste ist nicht leer, ich habe schon vorher mit dne Listen in mehreren Funktionen gearbeitet und es hat funktioniert, deshalb verstehe ich nicht, wieso es so reagiert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Natuerlich ist die Liste leer, schliesslich sagt das die Fehlermeldung. Und glaube mir: Der Interpreter luegt dich nicht an ;)

Wenn es vor der Aenderung lief, aber jetzt nicht mehr, dann hast du offensichtlich mehr geaendert als beabsichtigt. Da du die Liste veraenderst, kann das viele Gruende haben: Die Funktion wird oefters aufgerufen als du denkst, dasselbe Listenobjekt wird an mehr Stellen benutzt als du denkst, ....

Also Backtracke, was du genau veraendert hast und/oder gib uns ein echtes Minimalbeispiel.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Natürlich ist die Liste leer, die Fehlermeldung ist eindeutig und ein print wird dir das auch sicher sagen. Wahrscheinlich hast du die Liste irgendwo auf dem Weg verändert, überschrieben oder du arbeitest auf einer verkehrten Liste.
Das Leben ist wie ein Tennisball.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

That's bad. Ich werde daran arbeiten und schauen, ob es irgendwie auf ein Minimalbeispiel runterbringen kann. Es ist nur insofern dumm, als dass mir CSS die Fehlermeldung gibt, da ich ja Python nicht "direkt" laufe.. auch wenn das jetzt sehr handwaving gesagt wird.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Problem solved. Aus unersichtlichen Gruenden scheint pop nicht zu funktionieren, aber ich habe einen Weg herum mit anderen Funktionen gefunden. Vielen Dank fuer eure Hinweise! :)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

peter99 hat geschrieben:Aus unersichtlichen Gruenden scheint pop nicht zu funktionieren
Halte ich für äußerst unwahrscheinlich. Es wird eher so sein - wie ja die Vorposter schon schrieben - dass die Liste aus unersichtlichen Gründen leer ist, wenn `.pop()` sie "sieht". Und dann ist die Funktionsweise eben so, dass es zur Exception kommt.

Aber egal: Wenn du eine (hoffentlich vernünftige) Alternative gefunden hast, dann kann es dir ja im Prinzip egal sein, woran es lag...
BlackJack

Wenn es nur darum geht es zum laufen zu bekommen, kann es im Prinzip egal sein. Da aber offensichtlich beim `pop()` ein Fehler gemacht wurde, könnte es schon interessant sein *welcher*. Aus Fehlern lernt man schliesslich. Zumindest dann, wenn man ihnen auf den Grund geht. Die `pop()`-Methode funktioniert in dem Sinne, dass sie das macht was in der Dokumentation beschrieben ist. Es ist also nicht das `pop()` was nicht funktioniert, sondern anscheinend eine falsche Annahme über den Inhalt der Liste auf der die Methode aufgerufen wird.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Das denke ich auch, verstehe was du meinst.. hab nur einen gewissen Zeitdruck beim Programm. Soweit ich es sagen kann, hat es etwas mit dem Top down design und mit dem weitergebn von werten von einer funktion zur anderen zu tun- denn wenn ich die listen in der selben funktion wie pop habe und nicht einfach "weitergebe", funktionierts.. wenn du verstehst, was ich meine^^
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Klar, wenn du Listen herumreichst, dann wird ja immer auf dem selben Objekt gearbeitet. Damit wird es wahrscheinlich was zu tun haben. Dann brauchen wir für eine sinnvolle Analyse aber besser mal den kompletten Originalcode. Oder wenigstens ein luaffähiges Minimalbeispiel, wo der Fehler auch tatsächlich auftritt. Denn bei dem, was du im ersten Beitrag gepostet hast, gibt es ja überhaupt keinen `IndexError`.
Antworten