Listen in Liste speichern

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
steve_22
User
Beiträge: 2
Registriert: Samstag 12. Januar 2013, 18:01

Hallo,

im nachfolgenden Test-Code sollen Punkte als Listen innerhalb einer for-Schleife in einer Liste mittels append gespeichert werden.

Code: Alles auswählen

# -*- coding: utf-8 -*-

import sys

point=[0,0]
polyline=[]

for i in range(1,10):
	point[0]=i
	point[1]=2*i
	polyline.append(point)

print polyline
Die Ausgabe bei mir (python 2.7.3) lautet:

Code: Alles auswählen

[[9, 18], [9, 18], [9, 18], [9, 18], [9, 18], [9, 18], [9, 18], [9, 18], [9, 18]]
Das Ergebnis sollte aber sein:

Code: Alles auswählen

[[1, 2], [2, 4], [3, 6], [4, 8], [5, 10], [6, 12], [7, 14], [8, 16], [9, 18]]
Wieso wird die aktuelle Liste nicht nur drangehängt, sondern auch die vorletzte Liste in polyline mit der aktuellen überschrieben? entweder ich habe die Methode append nicht verstanden oder ich sehe den Wald vor lauter Bäume nicht.

Danke.
BlackJack

@steve_22: Du hängst da immer die *selbe* Liste an `polyline`. Du musst stattdessen keine bestehende Liste verändern und anhängen, sondern immer neue Listen erstellen und anhängen.

Das ganze könnte man aber auch als „list comprehension” in einer Zeile ausdrücken:

Code: Alles auswählen

polyline = [[i, i * 2] for i in xrange(1, 10)]
print polyline
steve_22
User
Beiträge: 2
Registriert: Samstag 12. Januar 2013, 18:01

Vielen Dank für die Antwort.
Nochmal zum Verständnis:
In meinem Test-Code wird bei jedem Schleifendurchlauf die selbe Liste an polyline angehängt und der Wert der bereits in polyline gespeicherten Listen aktualisiert, da es sich um die selbe Liste handelt? Wie erfolgt dann intern die Zuordnung einer Speicheradresse?
Weshalb wird dann bei folgendem Code jeweils eine neue Liste angehängt?

Code: Alles auswählen

# -*- coding: utf-8 -*-

import sys

point=[0,0]
polyline=[]

for i in range(1,10):
	point=[i,2*i]
	#point[0]=i
	#point[1]=2*i
	polyline.append(point)

print polyline
BlackJack

@steve_22: Bei dem Quelltext werden neue Listen angehängt weil Du neue Listen erzeugst.

Ich weiss nicht ob ich die Frage nach der Zuordnung einer Speicheradresse richtig verstehe. Objekte haben eine Speicheradresse. Wenn man ein neues Objekt erzeugt, wird die interne Repräsentation an irgend einer freien Speicheradresse abgelegt. Bei einer Zuweisung oder Argumentübergaben wird grundsätzlich immer das Objekt übergeben. Also intern eine Adresse. Das Objekt wird dabei nicht kopiert. Nach der Zuweisung oder Übergabe bezieht man sich weiterhin auf das selbe Objekt. Immer.
Antworten