Heim  >  Artikel  >  Backend-Entwicklung  >  Flache Kopie und tiefe Kopie in Python

Flache Kopie und tiefe Kopie in Python

高洛峰
高洛峰Original
2017-03-02 15:56:041320Durchsuche

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

Flache Kopie und tiefe Kopie in Python

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.

Flache Kopie und tiefe Kopie in Python

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])

Flache Kopie und tiefe Kopie in Python

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

Flache Kopie und tiefe Kopie in Python

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.

Flache Kopie und tiefe Kopie in Python

Ü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])

Flache Kopie und tiefe Kopie in Python

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.

Flache Kopie und tiefe Kopie in Python

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])

Flache Kopie und tiefe Kopie in Python

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!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn