[PYTHON] À propos du comportement de copy, deepcopy et numpy.copy

J'en suis accro, alors prenez note.

Aucune copie, copie superficielle, copie profonde

Si vous attribuez une liste à une autre variable en python, elle sera "passée par référence".

x = [1, 2, 3]
y = x
y[0] = 999
x  #Le passage à y a également affecté x.

>>> [999, 2, 3]

Pour éviter cela (= passer par valeur), utilisez la copie.

from copy import copy
x = [1, 2, 3]
y = copy(x)  # x[:]Mais bon(Au contraire, celui-ci est plus simple)
y[0] = 999
x  #Le passage à y n'a pas d'incidence

>>> [1, 2, 3]

Alors, la copie a-t-elle été complètement faite? Par exemple, les listes imbriquées sont transmises par référence.

from copy import copy
x = [[1, 2, 3], 4, 5]
y = copy(x)
y[0][0] = 999
x  #Même si c'est une copie!

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

Par conséquent, si vous souhaitez copier complètement tout, y compris l'imbrication, etc., utilisez deepcopy.

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

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

Et NumPy?

Quand je l'ai essayé, il semble qu'il soit automatiquement décidé d'exécuter une copie superficielle ou une copie profonde. Les deux suivants diffèrent selon que la deuxième liste de x contient 6 ou non ** seulement **.

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

Apparemment, une copie complète est effectuée pour quelque chose qui peut être converti en un tableau à n dimensions. Je pense que c'est juste une idée simple tant que la matrice est représentée par la liste imbriquée. Au fait, il en va de même pour la 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]]]

Impressions

** Deepcopy le plus fort! !! !! !! !! ** **

(Pour le moment) Officiellement, il y a deux problèmes avec les opérations de copie profonde.

Cependant, cela ne fait pas de mal d'avoir une copie légèrement redondante pour une manipulation personnelle. Le traitement récursif n'est pas si souvent nécessaire et la copie en profondeur peut être un bon choix dans les situations où vous en êtes accro.

Recommended Posts

À propos du comportement de copy, deepcopy et numpy.copy
À propos du comportement de yield_per de SqlAlchemy
A propos du comportement de enable_backprop de Chainer v2
À propos du comportement de la file d'attente pendant le traitement parallèle
Pensez à la nouvelle génération de Rack et WSGI
Notes personnelles sur l'intégration de vscode et anaconda
À propos des composants de Luigi
À propos des fonctionnalités de Python
Python # À propos de la référence et de la copie
Une note sur le comportement de bowtie2 lors de plusieurs coups
À propos de la valeur de retour de pthread_mutex_init ()
À propos de la valeur de retour de l'histogramme.
À propos du type de base de Go
À propos de la limite supérieure de threads-max
À propos de la taille des points dans matplotlib
À propos de la liste de base des bases de Python
À propos de Boxplot et Violinplot qui visualisent la variation des données indépendantes
J'ai étudié le comportement de la différence entre lien dur et lien symbolique
Ceci et celui de la notation d'inclusion.
Je voulais faire attention au comportement des arguments par défaut de Python
À propos de l'environnement virtuel de Python version 3.7
À propos du sensor_mode et de l'angle de vue de la picamera
Revoir le concept et la terminologie de la régression
A propos des arguments de la fonction setup de PyCaret
À propos de la relation entre Git et GitHub
L'histoire d'essayer deep3d et de perdre
À propos de l'équation normale de la régression linéaire
A propos des principales tâches de traitement d'image (vision par ordinateur) et de l'architecture utilisée
À propos de _ et __
Le comportement de @property est différent entre la définition de classe et les styles anciens et nouveaux
Parlez des fonctionnalités dont les pandas et moi étions en charge dans le projet
À propos de la notation de l'axe X du graphique à barres de Matplotlib
Résumé des différences entre PHP et Python
Compréhension complète des concepts de Bellmanford et Dyxtra
La réponse de "1/2" est différente entre python2 et 3
À propos de la vitesse de traitement de SVM (SVC) de scikit-learn
À propos du comportement Model.save () de Django et de l'erreur de blocage MySQL
Le comportement de signal () dépend de l'option de compilation
Organiser la signification des méthodes, des classes et des objets
Spécification de la plage des tableaux ruby et python
Copiez la liste en Python
Changer la couleur des erreurs et avertissements Fabric
À propos de la différence entre "==" et "is" en python
Écrire une note sur la version python de python virtualenv
Comparez la vitesse d'ajout et de carte Python
À propos du contenu de développement de l'apprentissage automatique (exemple)
[Note] À propos du rôle du trait de soulignement "_" en Python
Description générale des notificateurs CPUFreq core et CPUFreq
Visualisez le comportement de l'algorithme de tri avec matplotlib
Organisez l'utilisation super basique des Autotools et de pkg-config
J'ai lu et implémenté les variantes de UKR
À propos de l'attribution cumulative de la liste et du tableau numpy
Comportement de numpy.dot lors du passage d'un tableau 1d et d'un tableau 2d
Prise en compte des forces et faiblesses de Python
À propos des copies superficielles et profondes de Python / Ruby
Les parties sympas et regrettables de Cloud Datalab