Bevor wir darüber sprechen, was tiefes und flaches Kopieren ist, schauen wir uns zunächst dieses Phänomen an:
a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
Warum ändere ich nur b, aber es betrifft a? Ich habe gesehen, was ich in meinem vorherigen Artikel gesagt habe: Alle Speicherreferenzen werden in der Sequenz gespeichert.
Wenn wir also die leere Liste im Inneren durch b ändern, ändern wir tatsächlich dasselbe Objekt im Speicher, sodass es sich auf a auswirkt.
a = ['scolia', 123, [], ] b = a[:] print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
Der Code wurde korrekt überprüft. Obwohl a und b zwei verschiedene Objekte sind, sind die darin enthaltenen Referenzen gleich egal. Dies ist das sogenannte neue Objekt, der alte Inhalt.
Aber flache Kopie ist nicht nur das, siehe unten:
a = ['scolia', 123, [], ] b = a[:] b[1] = 666 print a print b
Das ist es nochmal Was ist los?
Studenten, die meine Anleitung zur Variablenzuweisung in Python gelesen haben, wissen: Bei unveränderlichen Datentypen wie Zeichenfolgen und Zahlen ist eine Änderung gleichbedeutend mit einer Neuzuweisung. Hier entspricht es einer Aktualisierung der Referenz.
Überprüfen Sie den Code:
a = ['scolia', 123, [], ] b = a[:] b[1] = 666 print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
Schauen Sie Komm ist richtig.
Was wir oben besprochen haben, ist flaches Kopieren. Zusammenfassend lässt sich sagen, dass flaches Kopieren nur eine Reihe von Referenzen kopiert. Wenn wir den veränderbaren Datentyp des kopierten Objekts ändern, werden die Referenzen nicht geändert Originalobjekt. Beim Ändern eines nicht änderbaren Objekts wird ein neues Objekt erstellt und die Referenz aktualisiert. Daher ist die Referenz auf das ursprüngliche Objekt anders und das Ergebnis ist anders.
So erstellen Sie eine flache Kopie:
1. Slicing-Vorgang
2 um ein neues Objekt zu erstellen. ( b = list(a) )
Tiefenkopieren bedeutet also, die darin referenzierten Objekte neu zu erstellen und eine neue Reihe von Referenzen zu generieren.
Im Grunde ist es so, aber für nicht veränderbare Objekte wie Zeichenfolgen und Zahlen scheint es etwas verschwenderisch zu sein, eine neue Kopie zu erstellen. Wenn Sie es ändern möchten, erstellen Sie jedoch ein neues Objekt Aktualisieren Sie die Referenz von. Es spielt also keine Rolle, ob Sie weiterhin die Originalreferenz verwenden, sie kann auch den Zweck erfüllen, Speicherplatz zu sparen.
Sehen Sie sich die Codeüberprüfung an:
from copy import deepcopy a = ['scolia', 123, [], ] b = deepcopy(a) b[1] = 666 print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
Korrekt überprüft.
Erstellung einer tiefen Kopie:
1 Wie im Codebeispiel verwendet, kann sie nur mit der Methode deepcopy() erstellt werden das integrierte Kopiermodul.
Okay, lasst uns hier aufhören, über die Probleme mit dunklen und flachen Kopien zu reden. Wenn es Fehler gibt oder Ergänzungen erforderlich sind, werden wir später fortfahren.
Der obige Artikel über ein detailliertes Verständnis von flachem Kopieren und tiefem Kopieren in Python ist der gesamte vom Herausgeber geteilte Inhalt. Ich hoffe, dass er Ihnen eine Referenz geben kann, und ich hoffe auch, dass dies für alle der Fall ist Unterstützen Sie die chinesische PHP-Website.
Weitere Artikel zum Thema Shallow Copy und Deep Copy in Python finden Sie auf der chinesischen PHP-Website!