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.

Code: Alles auswählen

a = 123179                                                                                                                                                                 
b = 123179                                                                                                                                                                 
print(id(a), id(b))

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.