Seite 1 von 1

Kleine Tupel-Verständnisfrage

Verfasst: Freitag 15. Mai 2009, 22:00
von kathiley
hallo,

also ich sitze gerade an einem Problem, das ich irgendwie nicht verstehe.

Code: Alles auswählen

backup_list = [Inhalt1, Inhalt2]

entry = InhaltX
new_list = backup_list

repeat = 3
while (repeat>0):
    new_list.append(entry)
    repeat = repeat-1

print backup_list
print new_list
Wieso sind am Ende beide Listen gleich? Also:

Code: Alles auswählen

new_list = [Inhalt1, Inhalt2, InhaltX, InhaltX, InhaltX]
backup_list = [Inhalt1, Inhalt2, InhaltX, InhaltX, InhaltX]
In der while Schleife wird die backup_list doch nicht verändert.
:?: :K

Re: Kleine Tupel-Verständnisfrage

Verfasst: Freitag 15. Mai 2009, 22:10
von numerix
kathiley hat geschrieben:hallo,

also ich sitze gerade an einem Problem, das ich irgendwie nicht verstehe.

Code: Alles auswählen

backup_list = [Inhalt1, Inhalt2]

entry = InhaltX
new_list = backup_list

repeat = 3
while (repeat>0):
    new_list.append(entry)
    repeat = repeat-1

print backup_list
print new_list
Wieso sind am Ende beide Listen gleich? Also:

Code: Alles auswählen

new_list = [Inhalt1, Inhalt2, InhaltX, InhaltX, InhaltX]
backup_list = [Inhalt1, Inhalt2, InhaltX, InhaltX, InhaltX]
In der while Schleife wird die backup_list doch nicht verändert.
:?: :K
Doch, weil

Code: Alles auswählen

new_list = backup_list
keine Kopie der Liste erzeugt, sondern nur eine weitere Referenz auf das gleiche Listenobjekt ist. Eine (einfache) Kopie kannst du so erzeugen:

Code: Alles auswählen

new_list = backup_list[:]

Verfasst: Freitag 15. Mai 2009, 22:18
von kathiley
hmm, hab ich mir schon irgendwie gedacht :oops:

danke für die schnelle Hilfe :!:

jetzt darf ich auch noch ein paar andere Skripte umschreiben, da hat es bis jetzt irgendwie immer geklappt, naja, mehr Glück als Verstand sag ich nur dazu :wink:

Verfasst: Freitag 15. Mai 2009, 22:22
von HerrHagen
Das Objektsystem von Python ist ein wenig anders aufgebaut als in C & Co.
Mit [Inhalt1, Inhalt2] erzeugst du ein neues Objekt (vom Typ Liste). Mit backup_list = ... erstellst du eine Referenz (also quasi eine Art Namen über die man das Objekt ansprechen kann) zu diesem Objekt. mit new_list = backup_list erstellst du eine weitere Referenz auf das Objekt (also vergibst quasi nur einen neuen Namen für das selbe Objekt). Wenn du das Objekt nun änderst, bekommst du die geänderte Version egal unter was für einen Namen du nun das Objekt ansprichst.
In Python gibt es auch unveränderliche Objekte (immutable) wie z.B. int's oder tupel. Da man diese nicht verändern kann, verhalten sie sich diese wie von dir erwartet.
PS: while (repeat>0): -> das ist ja schrecklich
Wenn du etwas n mal wiederholen willst schreib lieber for i in range(n): ...

Verfasst: Freitag 15. Mai 2009, 22:38
von kathiley
danke, wieder was dazu gelernt :D

... und keine Angst, in der while-Bedingung sind noch einige andere Faktoren drin, die ich hier nur rausgenommen habe