Array vergleichen funktioniert nicht!

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
waltecp3
User
Beiträge: 2
Registriert: Samstag 30. April 2011, 10:39

Hallo liebe python-Gemeinde,

Also ich bin ziemlich neu in python, und verwende python in Verbindung mit sagemath. Nun hab ich folgendes Problem. Ich hab eine Liste, das ein Output einer Funktion ist. Sprich: Es ist wiefolgt aufgebaut = [1,0,0,1,0,0]. Nun möchte ich gerne die Periodenlänge der Liste herausfinden, in dem Fall wäre das ja 3, weil e sich nach 3 Stellen wiederholt.
Ich dachte mir, das ich die Liste einfach kopiere, sodass ich sie 2 mal habe, und dann in einer for-schleife die Werte um eins nach links durchschiebe(der Wert der links "rausfällt" wird rechts wieder in die Liste gesteckt), und dieses solange wiederhole bis die Listen wieder gleich sind. Also ein Beispiel:
Liste1 = [1,0,0,1,0,0]
Liste2 = [1,0,0,1,0,0]

1. Left-Shift:

Liste1 = [1,0,0,1,0,0]
Liste2 = [0,0,1,0,0,1] -> nicht gleich

2.Left-Shift:

Liste1 = [1,0,0,1,0,0]
Liste2 = [0,1,0,0,1,0] -> nicht gleich

3. Left-Shift:
Liste1 = [1,0,0,1,0,0]
Liste2 = [1,0,0,1,0,0] -> gleich -> Periodenlänge = 3.

So nun hab ich folgendes Problem: Jedes mal wenn ich den left-shift mittels einer selbstgeschriebenen Funktion durchführe, werden beide Listen nach links geschoben, und nicht nur die eine! Ich weiß wirklich nicht woran es liegt. Ich hab den relevanten Code mal unten dran gehangen. Ich weiß das ist vielleicht nicht sehr gut programmiert und geht sicherlich auch noch effizienter(Tipps? ;-) )

Code: Alles auswählen

def lshift(array):
	temp = 0
	temp = array[0]
	for i in range (1,len(array)):
		array[i-1] = array[i]
	array[(len(array)-1)] = temp
	return array

output2 = output
for i in range(len(output)):
	output = lshift(output)
	if (output == output2):
		print i
		break
Ich bin über jede Hilfe dankbar :-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Der Grund ist eigentlich ganz einfach: Wenn etwas in Python an einen Namen gebunden wird, dann wird keine Kopie erzeugt, sondern lediglich eine Kopie der Referenz. Bei unveränderlichen Objekten, wie Strings oder Integern, macht das keinen Unterschied zur Kopie. Bei Veränderlichen Objekten, wie Listen oder Dictionaries, hingegen, arbeitest du auf dem selben Objekt, welches lediglich an zwei Namen gebunden ist. Der einfachste Weg ist es, sich explizit eine Kopie zu erzeugen. Im falle der Liste sieht das so aus:

Code: Alles auswählen

original = [1, 2, 4, 8]
copy = original[:]
Damit hast du nun zwei unterschiedliche Listen. Natürlich gilt weiterhin, für die Elemente in der Liste, dass nur die Referenezen kopiert wurden. Das ist in den meisten Fällen allerdings so gewollte.

Sebastian
Das Leben ist wie ein Tennisball.
waltecp3
User
Beiträge: 2
Registriert: Samstag 30. April 2011, 10:39

Das hätte mir ca. 6 Stunden Zeit und Nerven sparen können.
Ich bin das nicht gewohnt aus anderen Programmiersprache (z.B. PHP), das keine Kopie erstellt wird :)
Vielen vielen Dank! Nun funktionierts einwandfrei!
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

waltecp3 hat geschrieben:Ich bin das nicht gewohnt aus anderen Programmiersprache (z.B. PHP), das keine Kopie erstellt wird :)
Dann solltest Du ein gutes Python-Buch zur Hand nehmen, in dem diese, und andere, Dinge erklärt werden. ZB., dass Listen in Python eben Listen sind und keine Arrays. Oder dass man eine Liste in Python folgendermassen links-rotiert:

Code: Alles auswählen

def rotl(alist):
   return alist[1:] + alist[:1]
Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
Antworten