Seite 1 von 1
Kopieren von Skalaren vs. Kopieren von Listen
Verfasst: Freitag 23. Juli 2021, 17:57
von Strawk
Hallo!
Man betrachte folgenden Code:
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Fri Jul 23 17:57:04 2021
@author: User
"""
a = 5
b = a
a = 4
print(b)
al = [1,2,3]
bl = al
al[0] = 0
print(bl)
Ausgabe:
5
[0, 2, 3]
Bei Skalaren wird also der Wert kopiert, bei Listen hingegen nur eine Referenz. Warum ist das so? Wie ist die Historie dieser Struktur?
Grüße, Strawk
Re: Kopieren von Skalaren vs. Kopieren von Listen
Verfasst: Freitag 23. Juli 2021, 18:42
von __deets__
Auch bei Skalaren wird nur eine Referenz kopiert. Nur ist der Skalar unveränderlich, und darum gibt es nicht die Effekte, die du beobachtest.
Python ist da also Konsistent.
Re: Kopieren von Skalaren vs. Kopieren von Listen
Verfasst: Samstag 24. Juli 2021, 12:03
von rogerb
Namen referenzieren Objekte.
Es gibt aber feine Unterschiede in der Art und Weise wie "Skalare" und z.B. Listen: behandelt werden:
Code: Alles auswählen
# Bei
a = 1
b = 1
# passiert nicht das gleiche wie bei:
l1 = [3, 4, 5]
l2 = [3, 4, 5]
Code: Alles auswählen
a = 1
b = 1
print(id(a) == id(b))
"""
True
Das selbe Objekt wird referenziert.
"""
a = 2
print(id(a) == id(b))
"""
False
Wird a ein neuer Wert zugewiesen, wird auch ein neues Objekt erzeugt.
a und b referenzieren jetzt unterschiedliche Objekte
"""
l1 = [3, 4, 5]
l2 = [3, 4, 5]
print(id(l1) == id(l2))
"""
False
Unterschiedliche Listen-Objekte werden referenziert und können unabhängig von einander manipuliert werden
"""
l1[0] = 10
print(l1)
print(l2)
"""
[10, 4, 5]
[3, 4, 5]
"""
k1 = [6, 7, 8]
k2 = k1
print(id(k1) == id(k2))
"""
True
Das selbe Listen-Objekt wird referenziert und Manipulationen über k1 betreffen auch k2
"""
k1[0] = 10
print(k1)
print(k2)
"""
[10, 7, 8]
[10, 7, 8]
"""
Re: Kopieren von Skalaren vs. Kopieren von Listen
Verfasst: Samstag 24. Juli 2021, 12:52
von Sirius3
@rogerb: der erste Fall ist aber ein Implementierungsdetail.
Re: Kopieren von Skalaren vs. Kopieren von Listen
Verfasst: Sonntag 25. Juli 2021, 09:57
von bords0
Ich empfehle hierzu auch den python visualizer:
http://pythontutor.com/visualize.html#mode=edit
Damit kann man alle diese Effekte visualisieren und weitere Fragen durch Herumspielen beantworten. Ich habe bei etlichen Leuten festgestellt, dass dadurch die Erleuchtung kam.