Seite 1 von 1

listen

Verfasst: Samstag 9. März 2019, 11:02
von Ben_Dektor
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]]

Re: listen

Verfasst: Samstag 9. März 2019, 11:25
von Sirius3
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.

Re: listen

Verfasst: Samstag 9. März 2019, 11:29
von __blackjack__
@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()

Re: listen

Verfasst: Samstag 9. März 2019, 11:38
von Ben_Dektor
Ok danke es ist nur so damit es einfacher zu verstehen ist hatte die liste schon anders benannt aber nochmal vielen dank