Débutant en Python ici. Lire l'article sur les références de liste, les copies superficielles et profondes, a essayé ce qui suit:
xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> ys = list(xs) # Make a shallow copy xs[1][0] = 'X' >>> xs [[1, 2, 3], ['X', 5, 6], [7, 8, 9]] >>> ys [[1, 2, 3], ['X', 5, 6], [7, 8, 9]]
Résultat attendu:
>>>a ['A', 'b', 'c'] >>>b ['a', 'b', 'c']
Résultat réel: p>
>>>a ['A', 'b', 'c'] >>>b ['A', 'b', 'c']
Cependant, cela fonctionne dans le cas suivant:
a = ['a', 'b', 'c'] b = list(a) a[0] = 'A'
Quelqu'un peut-il expliquer si je manque quelque chose ici? Merci
Python 3.7.4
lien de l'article: https://realpython.com/copying-python-objects/
5 Réponses :
list () crée une nouvelle liste, ce qui signifie que les modifications apportées à l'original n'affecteront pas la nouvelle.
Lorsque vous dites b = list (a) , vous créez une nouvelle liste b dont les valeurs sont les mêmes que celles de a . À ce stade, les éléments de chaque liste sont égaux, mais ils ne sont pas le même objet. Autrement dit, un changement dans l'un de ces objets n'est pas reflété dans l'autre. Ils sont indépendants.
Si vous dites b = a , vous dites que b et a sont des noms qui font référence au même objet.
Vous pouvez vérifier par vous-même ce qui se passe en regardant l'ID sur l'objet. Vous pouvez voir que Vous venez d'ajouter le scénario suivant à la question: Il est vrai que xs et ys sont des objets différents: Mais les listes imbriquées sont elles-mêmes des objets. b = a crée une nouvelle entrée dans l'espace de noms qui fait simplement référence au même objet que a , mais c = a [:] code > et d = list (a) créent tous les deux de nouveaux objets qui copient le contenu d'un. id(ys[0])
Out[72]: 4690898696
id(xs[0])
Out[73]: 4690898696
id(ys)
Out[70]: 4691198664
id(xs)
Out[71]: 4690895496
xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
ys = list(xs)
ys = list (xs) a créé un nouvel objet, mais copié le contenu - les trois objets de liste imbriqués, à travers. a = ['a', 'b', 'c']
id(a)
Out[60]: 4690845768
b = a
id(b)
Out[62]: 4690845768
c = a[:]
id(c)
Out[65]: 4690851848
d = list(a)
id(d)
Out[67]: 4690846728
Ce que vous attendez, c'est b = a - cela fera que 'b' référencera la MÊME liste (objet) comme 'a'.
Lorsque vous faites b = list (a) , vous créez une nouvelle liste indépendante de "a".
Merci! Quand ce n'est qu'une référence, il est clair que cela donnera le résultat, cependant j'expérimentais avec des copies superficielles et essayais de comprendre le comportement
C'est parce que la fonction list () crée une NOUVELLE liste, si vous modifiez votre liste d'origine après l'attribution, la nouvelle liste ne changera pas.
Vous pouvez le faire en utilisant une valeur de variable, mais attention, par exemple
['a', 'a', 'b'] ['a', 'a', 'b']
sortie:
var = 'a' list1 = [var, 'a', 'b'] var = 'c' list2 = list1 print(list1) print(list2)
Vous pouvez changer la valeur de var et les deux listes changeront, sauf si vous ceci:
['a', 'a', 'b'] ['a', 'a', 'b']
résultat:
var = 'a' list1 = [var, 'a', 'b'] list2 = list1 print(list1) print(list2)
Pourquoi?
Parce que quand vous faites list1 = [var, 'a', 'b'] var a la valeur de 'a' , mais quand vous changer sa valeur, cela n'affectera pas le list1 car il a SAUVEGARDÉ la valeur de var lui-même, donc list2 ni
p>
Merde j'ai vu ta mise à jour ... ça m'a fait exploser l'esprit lmao
Quel article? Vous ne pouvez pas faire la distinction entre une copie profonde et superficielle sur une liste d'objets immuables.
La fonction list () prend tout itérable comme argument, donc elle crée un nouvel objet liste. Try list (open ('text_file', 'r'). Read ())
Je comprends qu'il crée un nouvel objet de liste, mais il crée une copie superficielle, ce qui signifie qu'il s'agit d'un niveau de profondeur seulement. L'objet de liste est nouveau, mais les éléments de liste sont toujours des références aux éléments enfants de la liste d'origine. Je mettrai à jour ma question avec le code où elle fonctionne réellement
Duplicata de stackoverflow.com/a/28684234/9510611 la réponse ici répond à votre question
@KevinGlasson parfait, exactement ce que je cherchais. Merci!