Liste in Liste-Problem

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@NWA: Wie gesagt, der `list()`-Aufruf hat den Vorteil a) mit jedem iterierbaren Objekt zu funktionieren und b) garantiert eine Liste zu liefern (und c) schon in Python 2 und <3.3 vorhanden zu sein). Und `copy()` hat den Vorteil garantiert eine (flache) Kopie zu liefern. Und beide sind IMHO lesbarer als slicing. Zumindest kann man nach beidem leichter in der Dokumentation suchen, falls man nicht weiss was das bedeutet. Wobei `copy()` schon vom Namen her recht selbsterklärend ist.

Was ist denn das Problem beim slicing von „immutables”? Also ein kompletter slice ``immutable[:]`` macht nicht so wirklich viel Sinn, aber ein Problem ist das ja auch nicht wirklich.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
NWA
User
Beiträge: 38
Registriert: Mittwoch 3. Februar 2021, 11:40

Hier ist im Buch auf S. 156 folgender code:

Code: Alles auswählen

s1="Kopiere mich"
s2 = s1[:]
s2 is s1
Als Ergebnis wird TRUE ausgegeben. Sprich: slicing klappt hier nicht. Als Begründung wird hier geschrieben das immutable Datentypen keinen Unterschied macht, ob die Instanz wirklich kopiert oder mit der ursprünglichen Instanz gearbeitet wird, da der Wert ohnehin nicht geändert werden kann. Aus Gründen der Effizienz wird deshalb nur neu referenziert.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Und wo ist das Problem? Slicing klappt exakt so, wie es vorgesehen ist. Niemand sagt, dass [:] eine Kopie liefern muß, da ist `list` eher die Ausnahme und deshalb sollte man das nicht in Fällen verwenden, wo eine Kopie gewollt ist.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich hatte ja Numpy-Arrays schon erwähnt, wo das auch nicht (immer) eine Kopie erzeugt, und die sind *nicht* immutable, also hat das auch überhaupt nichts mit mutable vs. immutable zu tun:

Code: Alles auswählen

In [489]: A = np.array([1, 2, 3, 4, 5])                                         

In [490]: B = A[:]                                                              

In [491]: A is B                                                                
Out[491]: False

In [492]: A[0] = 42                                                             

In [493]: A                                                                     
Out[493]: array([42,  2,  3,  4,  5])

In [494]: B                                                                     
Out[494]: array([42,  2,  3,  4,  5])
Obwohl A und B *nicht* identisch sind, ist das trotzdem keine unabhängige Kopie die da durch slicing erstellt wird. Es ist zwar ein anderes/neues Objekt, das aber ”nur” einen ”view” auf das ursprüngliche Objekt ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Das wird sicher noch interessant, wenn die Kapitel über __klassen kommen...
Antworten