J'en suis accro, alors prenez note.
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]
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]]]
** 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