listen

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
Ben_Dektor
User
Beiträge: 9
Registriert: Donnerstag 28. Februar 2019, 16:28

Hallo,

ich wollte damit anfangen ein Snake game zu programmieren und habe deswegen zuerst einmal eine Liste erstellt mit den Koordinaten der einzelnen "Körpern" der Schlange. Diese wollte ich dann so verändern, dass das Element 0 in der liste den Wert(die Koordinaten) von dem Element 1 in der Liste bekommt, das Element 1 in der Liste den Wert von dem 3 Element bekommt usw. . Das letzte Element in der Liste ist sozusagen mein Kopf der Schlange. Dieser hat aber natürlich keinen Vorgänger und soll dann per Tastendruck sich verändern. So weit bin ich leider noch nicht gekommen, weil hier mein Problem aufgetreten ist.
Als ich den letzten Wert in der Liste verändert habe(per Hand), hat sich das vorletzte Element mit verändert. Ich verstehe aber nicht so ganz warum. Kann mir da wer weiterhelfen.

Vielen Dank im Voraus

Hier ist der Code:

Code: Alles auswählen

list = []
list.append([5,1])
list.append([6,2])
list.append([7,3])
list.append([8,4])
print list

for i in range(0,len(list)-1):
    list[i] = list[i+1]
    print list
list[-1][0] = list[-1][0]+10
print list
und das ist was die Console ausgibt:

Code: Alles auswählen

[[5, 1], [6, 2], [7, 3], [8, 4]]
[[6, 2], [6, 2], [7, 3], [8, 4]]
[[6, 2], [7, 3], [7, 3], [8, 4]]
[[6, 2], [7, 3], [8, 4], [8, 4]]
[[8, 4], [7, 3], [8, 4], [8, 4]]
[[18, 4], [7, 3], [18, 4], [18, 4]]
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

Dein Problem ist, dass Du tatsächlich nur Referenzen auf Listen kopierst, am Schluß also das letzte und vorletzte Element die gleiche Liste enthalten.
Statt direkt auf der Liste mit Indizes zu arbeiten, solltest Du Dir anschauen, welche Methoden Listen bieten, um Elemente hinzuzufügen und zu entfernen. Konkret, das erste Element zu entfernen und hinten ein neues Element anzufügen.
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ben_Dektor: Du hast ja in der Schleife das vorletzte Element auf das letzte Element gesetzt. Also sind die letzten beiden Elemente die *gleiche* Liste. Und wenn Du die veränderst, sieht man diese Veränderung auch überall wo man auf diese Liste zugreifen kann.

Python kopiert von sich aus nie Werte bei Zuweisungen oder Argumentübergaben an Funktionen/Methoden. Wenn man den selben Wert zweimal irgend wo zuweist, ob nun an unterschiedliche Namen oder an unterschiedliche Indexe in einer Liste, es handelt sich immer um das selbe Objekt.

Weitere Anmerkungen zum Quelltext: Verwende Python 3. Python 2 ist veraltet und ab Ende des Jahres wird es weder Bugfixes noch Sicherheitsupdates dafür geben.

`list()` ist der Name des eingebauten Listentyps und man braucht den des öfteren um zum Beispiel die Elemente aus einem iterierbaren Objekt in einer Liste zu sammeln oder um eine flache Kopie einer Liste zu erstellen. Auch für allgemeine Beispiele sollte man sich deswegen einen anderen Namen suchen. Im konkreten Fall könnte man die Liste aber doch sogar `snake` nennen.

Statt da am Anfang viermal `append()` mit fest kodierten Werten für eine anfangs leere Liste aufzurufen, kann man doch einfach eine Liste mit diesen vier Elementen gleich bei der Zuweisung hinschreiben.

Die 0 als erstes Argument bei `range()` muss man nicht schreiben, das ist der Defaultstartwert.

Statt die Verschiebung selbst mit einer Schleife zu programmieren, bietet es sich an einfach das erste Element der Liste zu löschen, und dann basierend auf dem dann letzten Element ein neues zu erstellen und an die Liste anzuhängen.

Zudem würde ich aus den Koordinatenpaaren Tupel machen. Listen sind eher für gleichartige Werte, also wo jedes Element das gleiche bedeutet, also die Bedeutung nicht vom Index abhängt an dem ein Wert steht.

Code: Alles auswählen

#!/usr/bin/env python


def main():
    snake = [(5, 1), (6, 2), (7, 3), (8, 4)]
    print(snake)
    del snake[0]
    print(snake)
    x, y = snake[-1]
    snake.append((x + 10, y))
    print(snake)


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ben_Dektor
User
Beiträge: 9
Registriert: Donnerstag 28. Februar 2019, 16:28

Ok danke es ist nur so damit es einfacher zu verstehen ist hatte die liste schon anders benannt aber nochmal vielen dank
Antworten