Thema: Wieso werden zwei Listen bearbeitet?

04.03.16 12:25 #1

BlueBite

Registriert seit: 02.03.2016

Beiträge: 1

-

Hallo liebe Programmierer Community,

ich bin beim Schreiben eines kleinen Programms über ein komisches Problem gestolpert, dass jemand hier vielleicht klären kann.

Quellcode ausblenden Python-Code

eingabe = list("test")
ausgabe = []

print eingabe
ausgabe = eingabe
ausgabe.insert(1,"4")
print ausgabe
print eingabe



Es gibt zwei Listen - eine Masterliste (Eingabe) und eine bearbeitbare Liste (Ausgabe). Eigentlich müsste das Ergebnis dieses Codes folgendermaßen aussehen:

['t', 'e', 's', 't']
['t', '4', 'e', 's', 't']
['t', 'e', 's', 't']

tatsächlich wird jedoch mit dem Befehl .insert beide Listen angepasst und das Ergebnis ist:

['t', 'e', 's', 't']
['t', '4', 'e', 's', 't']
['t', '4', 'e', 's', 't']

Wieso ist das der Fall und wie kann ich das unterbinden??

----

edit 1:

Den Grund habe ich gerade gefunden:

Quellcode ausblenden Python-Code
eingabe = list("test")
ausgabe = []

print id(eingabe)
print id(ausgabe)


print eingabe
ausgabe = eingabe
print id(ausgabe)
print id(eingabe)

ausgabe.insert(1,"4")
print ausgabe
print eingabe



gibt mir:

140641828776920
140641828774832
['t', 'e', 's', 't']
140641828776920
140641828776920
['t', '4', 'e', 's', 't']
['t', '4', 'e', 's', 't']

d.h. Python gibt beiden Variablen einfach den selben Speicher - und somit werden beide Variablen natürlich gleichzeitig angepasst. Die Frage der Unterbindung ist damit aber noch offen...

---

edit 2:

Jetzt habe ich auch selbst die Lösung gefunden:

Quellcode ausblenden Python-Code
eingabe = list("test")
ausgabe = []

ausgabe = eingabe + ausgabe

print id(ausgabe)
print id(eingabe)
print " "

ausgabe.insert(1,"4")

print id(ausgabe)
print id(eingabe)

print ausgabe
print eingabe


indem man nicht die Variablen einfach gleichsetzt muss man die Listen stattdessen addieren. Das Ergebnis ist (das gewünschte):

140641828777424
140641828775480

140641828777424
140641828775480
['t', '4', 'e', 's', 't']
['t', 'e', 's', 't']

Beitrag editiert (04.03.2016 12:32 Uhr)
Beitrag editiert (04.03.2016 12:41 Uhr)

05.03.16 00:00 #2

chrigu78

Registriert seit: 01.03.2016

Beiträge: 1

-

Hi,

ja, das Gleichsetzen ist das Problem. Mach doch lieber eine Kopie von >eingabe<

ausgabe = eingabe[:]

dann hast du eine Liste >ausgabe< mit dem gleichen Inhalt, aber halt nur eine Kopie und nicht gleichgesetzt.

1817357

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.

15ms