232 votes

Comment faire une copie profonde d'une liste ?

Après E0_copy = list(E0) Je suppose. E0_copy est une copie profonde de E0 depuis id(E0) n'est pas égal à id(E0_copy) . Ensuite, je modifie E0_copy dans la boucle, mais pourquoi E0 pas la même après ?

E0 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for k in range(3):
    E0_copy = list(E0)
    E0_copy[k][k] = 0
    #print(E0_copy)
print E0  # -> [[0, 2, 3], [4, 0, 6], [7, 8, 0]]

1voto

AnupamChugh Points 740

Voici un exemple de la façon de copier en profondeur une liste 2D :

  b = [x[:] for x in a]

0voto

Shubham Kumar Points 134

Si vous n'êtes pas autorisé à importer directement des modules, vous pouvez définir votre propre fonction deepcopy comme -

def copyList(L):
if type(L[0]) != list:
    return [i for i in L]
else:
    return [copyList(L[i]) for i in range(len(L))]

Son fonctionnement peut être vu facilement comme -

>>> x = [[1,2,3],[3,4]]
>>> z = copyList(x)
>>> x
[[1, 2, 3], [3, 4]]
>>> z
[[1, 2, 3], [3, 4]]
>>> id(x)
2095053718720
>>> id(z)
2095053718528
>>> id(x[0])
2095058990144
>>> id(z[0])
2095058992192
>>>

-1voto

rnbcoder Points 753

Juste une fonction de copie profonde récursive.

def deepcopy(A):
    rt = []
    for elem in A:
        if isinstance(elem,list):
            rt.append(deepcopy(elem))
        else:
            rt.append(elem)
    return rt

Edit : Comme Cfreak l'a mentionné, ceci est déjà implémenté dans le module copy module.

-1voto

ShellayLee Points 139

En ce qui concerne la liste en tant qu'arbre, la copie profonde en python peut être écrite de manière plus compacte comme suit

def deep_copy(x):
    if not isinstance(x, list):
        return x
    else:
        return [deep_copy(elem) for elem in x]

Il s'agit essentiellement de parcourir la liste de manière récursive et en profondeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X