Heim >Backend-Entwicklung >Python-Tutorial >Objektkopie in Python
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; }
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]
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]
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]
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]
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.