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

Dienstag 3. Mai 2005, 17:13

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

Dienstag 3. Mai 2005, 17:20

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

Dienstag 3. Mai 2005, 17:27

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:

Dienstag 3. Mai 2005, 17:45

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

Dienstag 3. Mai 2005, 17:48

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

Dienstag 3. Mai 2005, 18:13

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

Dienstag 3. Mai 2005, 18:23

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 3. Mai 2005, 18:25

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 Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 3. Mai 2005, 18:25

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

Dienstag 3. Mai 2005, 18:27

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

Dienstag 3. Mai 2005, 18:30

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:

Dienstag 3. Mai 2005, 19:34

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

Dienstag 3. Mai 2005, 19:39

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 3. Mai 2005, 19:59

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 Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 3. Mai 2005, 20:00

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
Antworten