Kleine Tupel-Verständnisfrage

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
kathiley
User
Beiträge: 3
Registriert: Freitag 15. Mai 2009, 21:42

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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[:]
kathiley
User
Beiträge: 3
Registriert: Freitag 15. Mai 2009, 21:42

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:
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

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): ...
kathiley
User
Beiträge: 3
Registriert: Freitag 15. Mai 2009, 21:42

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
Antworten