Kopieren von Skalaren vs. Kopieren von Listen

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
Benutzeravatar
Strawk
User
Beiträge: 227
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

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
Ich programmiere erfolglos, also bin ich nicht.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

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]
"""
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@rogerb: der erste Fall ist aber ein Implementierungsdetail.

Code: Alles auswählen

a = 123179                                                                                                                                                                 
b = 123179                                                                                                                                                                 
print(id(a), id(b))
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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.
Antworten