Seltsamer Fehler (Pygame)

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.
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

Hallo
kann mir jemand bei diesem Fehler weiterfehelfen :

Code: Alles auswählen

a=asteroiden_liste[c][3]
TypeError: unsubscriptable object
Hab mir vorher den Inhalt von asteroiden_liste[c] printen lassen:

Code: Alles auswählen

(<Surface(90x96x8 SW)>, 545, -2202, 4, 90)
sprich da steht a=4
wo ist da das problem ?

thx 4 replys
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Könnte es sein, daß das [c] im Listennamen ärger macht?
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

ne ich hab das immer so gemacht und hat hne probs geklappt. sonst könnte ich ja warscheinlich auch net asteroiden_liste[c] printen !

so fehler tauchen manchmal auch woanders auf hab ich gerade festgestellt :

Code: Alles auswählen

if asteroiden_liste[k][2]>0:
TypeError: unsubscriptable object

Code: Alles auswählen

[(<Surface(60x64x8 SW)>, 488, 376, 4, 60), (<Surface(40x43x8 SW)>, 234, 500, 5, 40)]
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

gib doch mal ein bißchen mehr von Deinem Code, das darauf schließen läßt, was "asteroiden_liste" ist. Der Fehler kommt mir nämlich sehr bekannt vor ...

Gruß,
Christian
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

Code: Alles auswählen

for b in range(level+1):
        global zahl
        global zahl1
        zahl1=randint(3,9)
        zahl=zahl1*10
        speed=randint(4,7)
        asteroid_spawn_x=randint(0,800-zahl)
        asteroid_spawn_y=0-zahl
        asteroid_bild,asteroid_x,asteroid_y=pygame.image.load('bilder/asteroid'+str(zahl)+'.gif'),asteroid_spawn_x,asteroid_spawn_y
        global asteroid_daten                                     
        asteroid_daten=asteroid_bild,asteroid_x,asteroid_y,speed,zahl
        global asteroiden_liste
        asteroiden_liste.append(asteroid_daten)
        screen.blit(asteroid_bild,[asteroid_spawn_x,asteroid_spawn_y])
    while 1:              
        for c in range(level+1):
            a=asteroiden_liste[c][3]
            b=asteroiden_liste[c][2]
            asteroiden_liste[c]=asteroiden_liste[c][0],asteroiden_liste[c][1],a+b,asteroiden_liste[c][3],asteroiden_liste[c][4]
            if asteroiden_liste[c][2]>600:
                asteroiden_liste[c]=asteroiden_liste[c][0],asteroiden_liste[c][1],asteroiden_liste[c][2]-2500,asteroiden_liste[c][3],asteroiden_liste[c][4]
                asteroids_out=asteroids_out+1



a=asteroiden_liste[c][3]
TypeError: unsubscriptable object
bitte keine kommentare zu meiner chaotischen art programme zu schreiben ^^ das wird am ende wenn alles funzt verfeinert
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Code: Alles auswählen

for c in range(level+1):
            a=asteroiden_liste[c][3] 
Ich bin ja nun wahrlich kein Fachmann, aber für mich sieht das so aus, als wäre c eine Liste in Asteroiden_liste, und a somit das 4. Element in dieser Liste - die es ja gar nicht gibt... oder??
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

knekke hat geschrieben:

Code: Alles auswählen

for c in range(level+1):
            a=asteroiden_liste[c][3] 
Ich bin ja nun wahrlich kein Fachmann, aber für mich sieht das so aus, als wäre c eine Liste in Asteroiden_liste, und a somit das 4. Element in dieser Liste - die es ja gar nicht gibt... oder??
ich versteh zwar net was du meinst aber an asteroiden_liste[c][3] ist definitiv nix falsches weil mein ganzes programm so oder so ähnlich aufgebaut ist :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

rady hat geschrieben:Hab mir vorher den Inhalt von asteroiden_liste[c] printen lassen:

Code: Alles auswählen

(<Surface(90x96x8 SW)>, 545, -2202, 4, 90)
sprich da steht a=4
wo ist da das problem ?
Das das keine Liste ist, sondern ein Surface Objekt. Was ist bei dir 4 in dem Beispiel?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

rady hat geschrieben:bitte keine kommentare zu meiner chaotischen art programme zu schreiben ^^ das wird am ende wenn alles funzt verfeinert
Jetzt erst recht ;-): Du hast so viele Ungereimtheiten im Code, daß Du früher oder später Bugs haben wirst, die Du nicht mehr leicht finden wirst - zumindest wenn das Programm einigen Umfang haben wird.
Aber ich respektiere ansonsten Deine Bitte und gehe nicht in die Details.

EDIT: Der Leonidas war schneller und hat den Fehler gefunden - ziemlich genau da wo ich mangelns pygame geraten habe ;-).

Tut mir leid, daß ich nicht direkt weiterhelfen konnte.

Gruß,
Christian
Zuletzt geändert von CM am Dienstag 3. Mai 2005, 18:29, insgesamt 1-mal geändert.
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

Leonidas hat geschrieben:
rady hat geschrieben:Hab mir vorher den Inhalt von asteroiden_liste[c] printen lassen:

Code: Alles auswählen

(<Surface(90x96x8 SW)>, 545, -2202, 4, 90)
sprich da steht a=4
wo ist da das problem ?
Das das keine Liste ist, sondern ein Surface Objekt. Was ist bei dir 4 in dem Beispiel?
die 4 von (<Surface(90x96x8 SW)>, 545, -2202, 4, 90) ist asteroiden_liste[c][3]
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

CM hat geschrieben: Zu Deinem Problem: Ich sehe immer noch nicht wo diese Liste angelegt wird.
ja das habe ich weggelassen weil es einfach asteroiden_liste=[] ist.

der eigentlich inhalt wird durch das

Code: Alles auswählen

asteroid_daten=asteroid_bild,asteroid_x,asteroid_y,speed,zahl 
asteroiden_liste.append(asteroid_daten) 
reingebracht

------------------------------
Zuletzt geändert von rady am Dienstag 3. Mai 2005, 20:23, insgesamt 1-mal geändert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi

ich will wirklich nicht auf Deinem Code ruhacken. Aber dieses völlig unnmotivierte Einstreuen von global-Statements, bringt nicht nur viel Verwirrung, sondern ist auch risikoreich. Entferne doch erst einmal diese Statements und schaue Dir dann noch mal an, wo da welches Objekt überwiesen wird. Wie sollst Du sonst wissen, was gerade aktuell ist? (In der Python Referenz steht explitzit drin, daß man das global-Statement NICHT bei for-Schleifen, Klassen- und Funktionsdefinitionen, sowie Import-Statements verwenden soll!) Du machst die Sache noch schwerer, damit das Du globale und nicht-globale Identifizierungen munter mischt. Selbst wenn Du diesen Fehler findest - der nächste lauert um die Ecke.

Gruß,
Christian

PS Schreibe mal "import this" im Interpreter und lese die letzte Zeile. ;-) Ja, das ist jetzt alles besserwisserisch, das will ich zu meiner Schande gestehen.
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

hm kannst du mir denn sagen was ich machen soll ohne global ? wie soll das funktionieren ?

BACK TO TOPIC :

wenn ich die zeilen

Code: Alles auswählen

if schuesse==1:
                if asteroiden_liste[k][2]>0:
                   if schuesse_liste[0]+5>asteroiden_liste[k][1] and schuesse_liste[0]<asteroiden_liste[k][1]+asteroiden_liste[k][4]:
                       if schuesse_liste[1]+5>asteroiden_liste[k][2] and schuesse_liste[1]<asteroiden_liste[k][2]+asteroiden_liste[k][4]:
                            asteroiden_liste=asteroiden_liste[k][0],asteroiden_liste[k][1],asteroiden_liste[k][2]-2500,asteroiden_liste[k][3],asteroiden_liste[k][4]
                            asteroids_out=asteroids_out+1
weglasse taucht der fehler nicht mehr auf. könnte nen guter anhaltspunkt sein

Edit (Leonidas): Code in Python-Tags gesetzt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mach doch mal ein print type(asteroiden_liste), dann merkst du, dass asteroiden_liste keine Liste ist.

Was deinen Code angeht: tut mir leid, aber das ist grausam (ich weiß, ich klinge genauso wie CM besserwisserisch, aber bei dem COde möchte ich weglaufen).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Aber das ist doch was ich meine: Du löscht Teile des Codes, die erst einmal nicht mit dem Fragment zu tun haben, wo der Fehler auftritt. Und schon bist Du ein Stück weiter?!
So etwas kann funktionieren, aber besser ist es Argumente an Funktionen zu übergeben und Werte von Funktionen zurückzugeben. Ein gelgentliches "global", wohldosiert und gut durchdacht, kann sinnvoll sein. Aber Du hast, wenn ich richtig zähle, 17 Funktionen und 60 (!) global-Statements auf effektiv vielleicht 500 Zeilen Code. D. h. Du baust etwa jede achte Zeile eine Fehlerquelle ein.

N.B.: Re-Factoring ist ja keine Schande, sondern zeugt davon, daß man sich über seinen Code Gedanken macht. Ein guter Bekannter von mir, "richtiger" Programmierer, schmeißt gelgentlich tausende Zeilen Code weg und schreibt sie neu. Mir ist es schwer gefallen davon zu lernen - aber der Mann hat recht, es bringt manchmal tatsächlich was.

Gruß,
Christian
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

ne leute ich lösch das doch jetzt nicht alles und machs neu :cry:

vorallem ICH WEISS ES NICHT BESSER

ich habs so gemacht weil ich keine ahnung hab wie ich sonst die ganzen variablen weitergeben soll.
wenn ich global nicht benutze und ich in a eine variable definiere und a b auslößt welches wiederum c auslößt, welches die variable aus a braucht dann müsste ich die ja auch in b mitschleppen obwohl sie nicht gebraucht wird. und da mein programm ja aus 1000000 funtkionen besteht wäre das auch ein chaos und ich müsste immer weit im vorraus denken . waaah
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ach so wars doch nicht gemeint: :tröst:

Wie wäre es Du schaust Dir mal mal ein paar Beispiele im Forum an? Und ein paar der kleineren Beispiele in der Pygame-Domäne. Du wirst sehen: Du kannst einen Gutteil Deines Codes löschen und trotzdem wirst Du keine Funktionalität verlieren. Aber Du wirst Übersicht gewinnen.

Gruß,
Christian
rady
User
Beiträge: 20
Registriert: Dienstag 3. Mai 2005, 17:08

hm dann werd ichs wohl am langen wochende mal machen müssen :cry:
trotzdem danke für die antworten !

naja hab ja noch 4-5 wochen bis ichs dem lehrer abgeben muss ^^
ich werde euch den neuen code zeigen wenn er fertig ist :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hier hast du etwas Code, den du mehr oder weniger als Beispiel nehemn kannst, ist zwar nicht perfekt, aber ich werde mich demnächst daran machen alle globals auszumerzen (ist ja nicht schwer).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

CM hat geschrieben:N.B.: Re-Factoring ist ja keine Schande, sondern zeugt davon, daß man sich über seinen Code Gedanken macht. Ein guter Bekannter von mir, "richtiger" Programmierer, schmeißt gelgentlich tausende Zeilen Code weg und schreibt sie neu. Mir ist es schwer gefallen davon zu lernen - aber der Mann hat recht, es bringt manchmal tatsächlich was.
Das ist auch das Grundkonzept von Extreme Programming, würde ich auch gerne machen.. wenn ich genug Unittests hätte um prüfen zu können ob die neue Version genauso funktioniert. :(
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten