Kopieren von arrays mit Gleichsetzungszeichen?
Was passiert beim kopieren beziehungsweise Gleichsetzen von Python listen mittels Gleichheitszeichen und was hat dies mit c-Arrays zu tun?
3 Antworten
Na, schauen wir uns das doch einfach an, oder?
>>> a=[1,2,3,4]
>>> b=a
>>> id(a)
140565166645312
>>> id(b)
140565166645312
>>> a.append(5)
>>> a
[1, 2, 3, 4, 5]
>>> b
[1, 2, 3, 4, 5]
>>>
Die Zuweisung b=a erzeugt also nur einen neuen Namen mit Referenz auf das gleiche Objekt.
>>> a=[1,2,3,4]
>>> b=a.copy()
>>> a.append(5)
>>> a
[1, 2, 3, 4, 5]
>>> b
[1, 2, 3, 4]
Beim Kopieren, wird ein neues Objekt erzeugt, d.h. a und b sind Bezeichner für unterschiedliche Listenobjekte.
Den Bezug zu c-Arrays sehe ich nicht, außer daß Listen als dynamisches Array von Pointern implementiert sind.
Du meinst sowas?
a = [1, 2, 3]
b = a
In dem Fall wird die Referenz der Liste kopiert, anstatt dass eine Kopie der Liste gemacht wird, wie man es vielleicht erwarten würde.
Wenn du nun also an b eine Änderung vornimmst, dann nimmst du diese Änderung gleichzeitig an a vor.
b.append(4)
print(a) // Ausgabe: [1, 2, 3, 4]
Die Variable beinhaltet nämlich eigentlich garnicht die Liste, sondern nur einen Pointer auf die Liste. Also eine Referenz auf den Speicherplatz, an dem sich die Liste (intern ein C-Array vermute ich mal) befindet.
Durch die Zuweisung b = a ist dann in beiden Variablen die gleiche Referenz auf die selbe Liste gespeichert.
Ich kenne mich nicht sehr gut mit Python aus, meiner aber, dass in diesem Fall kein neuer Array erstellt wird, sondern der alte auf seinem bestehenden Speicherplatz weitergenutzt wird ("es wird kein neuer Speicher verbraucht")
Garantieren kann ich das aber leider nicht, c-Arrays kann ich dir auch nicht beantworten. Hoffe das hilft, warte aber mal noch ab, bis jemand qualifizierteres schreibt und mich evtl korrigiert :)