[PYTHON] Über das Verhalten von copy, deepcopy und numpy.copy

Ich bin süchtig danach, also mach dir eine Notiz.

Keine Kopie, flache Kopie, tiefe Kopie

Wenn Sie eine Liste einer anderen Variablen in Python zuweisen, wird diese als Referenz übergeben.

x = [1, 2, 3]
y = x
y[0] = 999
x  #Die Änderung von y wirkte sich auch auf x aus.

>>> [999, 2, 3]

Um dies zu vermeiden (= Wert übergeben), verwenden Sie copy.

from copy import copy
x = [1, 2, 3]
y = copy(x)  # x[:]Aber gut(Vielmehr ist dieser einfacher)
y[0] = 999
x  #Die Änderung in y hatte keine Auswirkungen

>>> [1, 2, 3]

Wurde die Kopie also vollständig erstellt? Beispielsweise werden verschachtelte Listen als Referenz übergeben.

from copy import copy
x = [[1, 2, 3], 4, 5]
y = copy(x)
y[0][0] = 999
x  #Obwohl es eine Kopie ist!

>>> [[999, 2, 3], 4, 5]

Wenn Sie also alles, einschließlich Verschachtelung usw., vollständig kopieren möchten, verwenden Sie deepcopy.

from copy import deepcopy
x = [[1, 2, 3], 4, 5]
y = deepcopy(x)
y[0][0] = 999
x

>>> [[1, 2, 3], 4, 5]

Was ist mit NumPy?

Als ich es ausprobiert habe, scheint es automatisch entschieden zu werden, ob eine flache oder eine tiefe Kopie ausgeführt werden soll. Die folgenden zwei unterscheiden sich darin, ob die zweite Liste in x 6 enthält oder nicht ** nur **.

import numpy as np
x = [[1, 2, 3], [4, 5]]
y = np.copy(x)
y[0][0] = 999
x

>>> [[999, 2, 3], [4, 5, 6]]
import numpy as np
x = [[1, 2, 3], [4, 5, 6]]
y = np.copy(x)
y[0][0] = 999
x

>>> [[1, 2, 3], [4, 5, 6]]

Anscheinend wird eine tiefe Kopie für etwas durchgeführt, das in ein n-dimensionales Array umgewandelt werden kann. Ich denke, es ist nur eine einfache Idee, solange die Matrix durch die verschachtelte Liste dargestellt wird. Gleiches gilt übrigens auch für 3D.

import numpy as np
x = [[[1, 0], [2, 0], [3]],
     [[4, 0], [5, 0], [6, 0]]]
y = np.copy(x)
y[0][0][0] = 999
x

>>> [[[999, 0], [2, 0], [3]], [[4, 0], [5, 0], [6, 0]]]
import numpy as np
x = [[[1, 0], [2, 0], [3, 0]],
     [[4, 0], [5, 0], [6, 0]]]
y = np.copy(x)
y[0][0][0] = 999
x

>>> [[[1, 0], [2, 0], [3, 0]], [[4, 0], [5, 0], [6, 0]]]

Impressionen

** Deepcopy am stärksten! !! !! !! !! ** ** **

(Vorerst) Offiziell gibt es zwei Probleme mit Deep Copy-Vorgängen.

Es tut jedoch nicht weh, eine leicht redundante Kopie für den persönlichen Umgang zu haben. Rekursive Verarbeitung wird nicht so oft benötigt, und Deepcopying kann in Situationen, in denen Sie süchtig danach sind, eine gute Wahl sein.

Recommended Posts

Über das Verhalten von copy, deepcopy und numpy.copy
Über das Verhalten von Yield_per von SqlAlchemy
Informationen zum Verhalten von enable_backprop von Chainer v2
Informationen zum Verhalten der Warteschlange während der Parallelverarbeitung
Denken Sie an das Rack und WSGI der nächsten Generation
Persönliche Hinweise zur Integration von vscode und anaconda
Über die Komponenten von Luigi
Über die Funktionen von Python
Python # Über Referenz und Kopie
Ein Hinweis zum Verhalten von bowtie2 bei mehreren Treffern
Über den Rückgabewert von pthread_mutex_init ()
Über den Rückgabewert des Histogramms.
Über den Grundtyp von Go
Über die Obergrenze von Threads-max
Über die Größe der Punkte in Matplotlib
Informationen zur Grundlagenliste der Python-Grundlagen
Über Boxplot und Violinplot, die die Variation unabhängiger Daten visualisieren
Ich untersuchte das Verhalten bezüglich des Unterschieds zwischen Hard Link und Symbolic Link
Dies und das der Einschlussnotation.
Ich wollte vorsichtig mit dem Verhalten der Standardargumente von Python sein
Informationen zur virtuellen Umgebung von Python Version 3.7
Über sensor_mode und Blickwinkel der Picamera
Überprüfen Sie das Konzept und die Terminologie der Regression
Über die Argumente der Setup-Funktion von PyCaret
Über die Beziehung zwischen Git und GitHub
Die Geschichte, deep3d auszuprobieren und zu verlieren
Über die Normalgleichung der linearen Regression
Über die Hauptaufgaben der Bildverarbeitung (Computer Vision) und die verwendete Architektur
Über _ und __
Das Verhalten von @property unterscheidet sich zwischen Klassendefinition und alten und neuen Stilen
Sprechen Sie über die Funktionen, für die Pandas und ich im Projekt verantwortlich waren
Informationen zur X-Achsen-Notation des Balkendiagramms von Matplotlib
Zusammenfassung der Unterschiede zwischen PHP und Python
Vollständiges Verständnis der Konzepte von Bellmanford und Dyxtra
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Über die Verarbeitungsgeschwindigkeit von SVM (SVC) von Scikit-Learn
Informationen zum Model.save () -Verhalten von Django und zum MySQL-Deadlock-Fehler
Das Verhalten von signal () hängt von der Kompilierungsoption ab
Organisieren Sie die Bedeutung von Methoden, Klassen und Objekten
Angeben des Bereichs von Ruby- und Python-Arrays
Kopieren Sie die Liste in Python
Ändern Sie die Farbe von Fabric-Fehlern und Warnungen
Über den Unterschied zwischen "==" und "is" in Python
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Allgemeine Beschreibung des CPUFreq-Kerns und der CPUFreq-Benachrichtigungen
Visualisieren Sie das Verhalten des Sortieralgorithmus mit matplotlib
Organisieren Sie die grundlegende Verwendung von Autotools und pkg-config
Ich habe die Varianten von UKR gelesen und implementiert
Informationen zur kumulativen Zuordnung von Liste und Numpy-Array
Verhalten von numpy.dot beim Übergeben von 1d-Array und 2d-Array
Berücksichtigung der Stärken und Schwächen von Python
Über flache und tiefe Kopien von Python / Ruby
Die schönen und bedauerlichen Teile von Cloud Datalab