Objektkopie in Python

高洛峰
Freigeben: 2016-10-19 13:39:05
Original
1413 Leute haben es durchsucht

Möchten Sie ein Objekt kopieren? Denn egal, ob Sie in Python ein Objekt als Parameter oder als Funktionsrückgabewert übergeben, es wird als Referenz übergeben.

Was ist Pass-by-Reference? Schauen wir uns eine C-Funktion an, die zwei Zahlen austauscht:

void swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}
Nach dem Login kopieren

Dieses Beispiel ist ein Pass-by Referenzbeispiel! Der Zweck besteht darin, das Konzept zu erläutern: Übergabe als Referenz bedeutet, dass Sie eine Referenz auf das Objekt übergeben, und Änderungen an dieser Referenz führen auch zu Änderungen am ursprünglichen Objekt. Freunde, die C/C studiert haben, wissen, dass Sie beim Austausch zweier Zahlen, wenn Sie eine Swap-Funktion selbst implementieren, deren Referenz oder Zeiger übergeben müssen.

Python verwendet die Referenzübergabe direkt. Worüber möchten Sie sich sonst noch beschweren? Haben Sie jemals über die Situation nachgedacht, dass ich das ursprüngliche Objekt nicht ändern möchte? Wenn ja, dann schauen Sie hier!

Angenommen, ich habe jetzt eine Liste namens l1 und benötige jetzt eine Kopie von l1. Wenn ich direkt eine Methode wie l2 = l1 verwende und dann eine Reihe von Änderungen an l2 vornehme, wird dies der Fall sein Äquivalent dazu, dass ich l1 direkt ändere, was nicht das ist, was ich will! Zum Beispiel:

l1 = [1, 2]
l2 = l1
l2.append(3)
print l1
print l2
# l1 = [1, 2, 3], l2 = [1, 2, 3]
Nach dem Login kopieren

Dies wird durch die Übergabe von Python-Referenzen verursacht, das heißt, l1 und l2 gehören zum selben Listenobjekt. Wie kann das sein? wir bekommen ein anderes Wo ist das Objekt? Ist das nicht so einfach? Streuen Sie es in Scheiben, zum Beispiel:

l1 = [1, 2]
l2 = l1[:]
l2.append(3)
# l1 = [1, 2], l2 = [1, 2, 3]
Nach dem Login kopieren

Schauen wir uns eine kompliziertere Situation an:

l1 = [[1, 2], 3]
l2 = l1[:]
l2.append(4)
# l1 = [[1, 2], 3], l2 = [[1, 2], 3, 4]
l2[0].append(5)
# l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4]
Nach dem Login kopieren

Aha, es scheint, dass etwas nicht stimmt, das ist nicht das, was wir brauchen! Was zu tun? Okay, kommen wir zum heutigen Thema, dem Kopiermodul in Python!

Kopie importieren

Wenn Sie ein Containerobjekt und alle darin enthaltenen Elemente (einschließlich der untergeordneten Elemente des Elements) kopieren möchten, verwenden Sie copy.deepcopy. Diese Methode wird einige Zeit in Anspruch nehmen Wenn Sie jedoch eine vollständige Kopie benötigen, ist dies die einzige Möglichkeit. Die oben erwähnte Slicing-Methode entspricht der Kopierfunktion im Kopiermodul.

Der obige Kopiervorgang ist so einfach geworden:

l1 = [[1, 2], 3]
l2 = copy.copy(l1)
l3 = copy.deepcopy(l1)
l2.append(4)
l2[0].append(5)
l3[0].append(6)
# l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4], l3 = [[1, 2, 6], 3]
Nach dem Login kopieren

Zugehörige Anweisungen:

copy(x)

Flache Kopieroperation für beliebige Python-Objekte.

Weitere Informationen finden Sie im __doc__-String des Moduls.

deepcopy(x, memo=None, _nil=[])

Deep-Copy-Vorgang für beliebige Python-Objekte.

Weitere Informationen finden Sie im __doc__-String des Moduls.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage