Avec new_list = my_list, vous n'avez pas réellement avoir deux listes. L'affectation copie simplement la référence à la liste, pas le liste, de sorte que les deux new_list et my_list reportez-vous à la liste après la cession.
À copier la liste, vous avez différentes possibilités:
Vous pouvez utiliser la builtin liste.copier() méthode (disponible depuis le python 3.3):
new_list = old_list.copy()
Vous pouvez le couper en tranches:
new_list = old_list[:]
Alex Martelli est avis (au moins en 2007) à ce sujet est, que il est bizarre de syntaxe et il ne fait pas de sens pour l'utiliser jamais. 😉 (Dans son avis, le suivant est plus lisible).
Vous pouvez utiliser le construit en list() fonction:
J'ai 100% d'accord. Pour une réponse à un important Python question, celui-ci est un peu dispersée et de la date. Si je ne suis pas d'erreur possible : newlist = [*mylist] est aussi une possibilité en Python 3. newlist = list(mylist) est peut-être plus clair. une autre possibilité est new_list = old_list * 1 Laquelle de ces méthodes sont la copie superficielle et qui sont des copie en profondeur? tous, sauf le dernier de faire une copie
Donc la plus rapide est la liste de découpage. Mais sachez que copy.copy(), list[:] et list(list), contrairement à copy.deepcopy() et la version de python n'avez pas de copie de toutes les listes, les dictionnaires et les instances de classe dans la liste, donc si les originaux changement, ils vont changer dans la liste copiée aussi, et vice versa.
(Voici le script si quelqu'un est intéressé ou veut soulever des questions:)
from copy import deepcopy
class old_class:def __init__(self):
self.blah ='blah'class new_class(object):def __init__(self):
self.blah ='blah'
dignore ={str:None, unicode:None, int:None, type(None):None}defCopy(obj, use_deepcopy=True):
t = type(obj)if t in(list, tuple):if t == tuple:# Convert to a list if a tuple to # allow assigning to when copying
is_tuple =True
obj = list(obj)else:# Otherwise just do a quick slice copy
obj = obj[:]
is_tuple =False# Copy each item recursivelyfor x in xrange(len(obj)):if type(obj[x])in dignore:continue
obj[x]=Copy(obj[x], use_deepcopy)if is_tuple:# Convert back into a tuple again
obj = tuple(obj)elif t == dict:# Use the fast shallow dict copy() method and copy any # values which aren't immutable (like lists, dicts etc)
obj = obj.copy()for k in obj:if type(obj[k])in dignore:continue
obj[k]=Copy(obj[k], use_deepcopy)elif t in dignore:# Numeric or string/unicode? # It's immutable, so ignore it!passelif use_deepcopy:
obj = deepcopy(obj)return obj
if __name__ =='__main__':import copy
from time import time
num_times =100000
L =[None,'blah',1,543.4532,['foo'],('bar',),{'blah':'blah'},
old_class(), new_class()]
t = time()for i in xrange(num_times):Copy(L)print'Custom Copy:', time()-t
t = time()for i in xrange(num_times):Copy(L, use_deepcopy=False)print'Custom Copy Only Copying Lists/Tuples/Dicts (no classes):', time()-t
t = time()for i in xrange(num_times):
copy.copy(L)print'copy.copy:', time()-t
t = time()for i in xrange(num_times):
copy.deepcopy(L)print'copy.deepcopy:', time()-t
t = time()for i in xrange(num_times):
L[:]print'list slicing [:]:', time()-t
t = time()for i in xrange(num_times):
list(L)print'list(L):', time()-t
t = time()for i in xrange(num_times):[i for i in L]print'list expression(L):', time()-t
t = time()for i in xrange(num_times):
a =[]
a.extend(L)print'list extend:', time()-t
t = time()for i in xrange(num_times):
a =[]for y in L:
a.append(y)print'list append:', time()-t
t = time()for i in xrange(num_times):
a =[]
a.extend(i for i in L)print'generator expression extend:', time()-t
MODIFIER: Ajout de nouvelles de style à l'ancienne, des classes de style et dicts les benchmarks, et fait de la version de python beaucoup plus rapide et ajouté un peu plus de méthodes, y compris la liste d'expressions et de extend().
Puisque vous êtes comparative, il pourrait être utile d'inclure un point de référence. Ces chiffres exacts en 2017 à l'aide de Python 3.6 avec le code compilé? Je suis en notant la réponse ci-dessous (stackoverflow.com/a/17810305/26219) déjà des questions de cette réponse. utiliser le timeit module. aussi, vous ne pouvez pas les conclusions de l'arbitraire micro repères comme ça. Si vous souhaitez inclure une nouvelle option pour 3.5+, [*old_list] doit être à peu près équivalent à list(old_list), mais depuis c'est de la syntaxe, pas général de l'appel de la fonction des voies, il vous permettra de gagner un peu de l'exécution (et contrairement à old_list[:], qui n'a pas de type de convertir, [*old_list] fonctionne sur n'importe quel itérable et produit un list).
Quelles sont les options pour dupliquer ou copier une liste en Python?
En Python 3, une copie peut être faite avec:
a_copy = a_list.copy()
En Python 2 et 3, vous pouvez obtenir une copie superficielle avec un tranche de l'original:
a_copy = a_list[:]
Explication
Il y a deux sémantique manières de copier une liste. Une copie crée une nouvelle liste des objets de même, une copie en profondeur crée une nouvelle liste contenant les nouvelles équivalent objets.
Peu profonde de la liste de copie
D'une copie des copies de la liste elle-même, qui est un conteneur de références aux objets dans la liste. Si les objets contenus eux-mêmes sont mutables et est changée, le changement pourra être répercuté dans les deux listes.
Il y a différentes façons de le faire en Python 2 et 3. Le Python 2 façons travaillera également en Python 3.
Python 2
En Python 2, le idiomatiques façon de faire une copie de la liste avec une tranche de l'original:
a_copy = a_list[:]
Vous pouvez également faire la même chose en passant par la liste par le biais de la liste de constructeur,
a_copy = list(a_list)
mais en utilisant le constructeur est de moins en moins efficace:
>>> timeit
>>> l = range(20)>>> min(timeit.repeat(lambda: l[:]))0.30504298210144043>>> min(timeit.repeat(lambda: list(l)))0.40698814392089844
Python 3
En Python 3, les listes d'obtenir le list.copy méthode:
À l'aide de new_list = my_list modifie new_list chaque fois my_list changements. Pourquoi est-ce?
my_list est juste un nom qui points à la liste actuelle dans la mémoire. Quand vous dites new_list = my_list vous n'êtes pas en faire une copie, vous êtes juste ajouter un autre nom à cette liste d'origine dans la mémoire. Nous pouvons avoir des problèmes similaires lorsque nous faisons des copies de listes.
>>> l =[[],[],[]]>>> l_copy = l[:]>>> l_copy
[[],[],[]]>>> l_copy[0].append('foo')>>> l_copy
[['foo'],[],[]]>>> l
[['foo'],[],[]]
La liste est juste un tableau de pointeurs vers du contenu, donc d'une copie simple copie seulement les pointeurs, et vous avez donc deux listes différentes, mais elles ont le même contenu. Faire des copies du contenu, vous avez besoin d'une copie en profondeur.
Pour montrer comment cela nous permet de faire de nouveaux sous-listes:
>>>import copy
>>> l
[['foo'],[],[]]>>> l_deep_copy = copy.deepcopy(l)>>> l_deep_copy[0].pop()'foo'>>> l_deep_copy
[[],[],[]]>>> l
[['foo'],[],[]]
Et nous voyons donc que la profondeur copié liste est une liste différente de l'original. Vous pourriez rouler votre propre fonction, mais n'en ont pas. Vous êtes susceptibles de créer des bugs que vous n'avez pas normalement à l'aide de la bibliothèque standard du propriétédeepcopy fonction.
Ne pas utiliser eval
Vous pouvez voir ce utilisé comme un moyen de propriétédeepcopy, mais ne le faites pas:
problematic_deep_copy = eval(repr(a_list))
C'est dangereux, surtout si vous êtes à l'évaluation de quelque chose à partir d'une source vous n'avez pas confiance.
Ce n'est pas fiable, si un sous-élément que vous êtes la copie n'a pas une représentation qui peut être eval pour reproduire un élément équivalent.
Vous n'avez pas besoin d'un propriétédeepcopy si la liste est en 2D. Si c'est une liste de listes, et ces listes n'ont pas de listes à l'intérieur d'eux, vous pouvez utiliser une boucle for. Actuellement, je suis en utilisant list_copy=[]for item in list: list_copy.append(copy(item)) et il est beaucoup plus rapide.
Il y a beaucoup de réponses déjà que vous dire comment faire une bonne copie, mais aucun d'entre eux disent pourquoi l'original de votre "copie" a échoué.
Python ne pas stocker des valeurs dans des variables; il se lie à des noms aux objets. Votre affectation d'origine a pris de l'objet visé par my_list et lié à new_list. Peu importe le nom que vous utilisez, il est toujours qu'une seule liste, de sorte que les modifications apportées lorsque l'on se réfère à elle comme my_list persiste lorsque l'on se réfère à elle comme new_list. Chacun des autres réponses à cette question vous donne différentes façons de créer un nouvel objet à lier à new_list.
Chaque élément d'une liste des actes comme un nom, en ce que chaque élément se lie non exclusivement à un objet. Une copie crée une nouvelle liste dont les éléments se lient aux mêmes objets comme avant.
new_list = list(my_list)# or my_list[:], but I prefer this syntax# is simply a shorter way of:
new_list =[element for element in my_list]
De prendre votre liste de copie un peu plus loin, copie de chaque objet votre liste se réfère, et lient ces élément copies à une nouvelle liste.
import copy
# each element must have __copy__ defined for this...
new_list =[copy.copy(element)for element in my_list]
Ce n'est pas encore une copie en profondeur, parce que chaque élément d'une liste peut se référer à d'autres objets, tout comme la liste est lié à l'un de ses éléments. De façon récursive copie de chaque élément dans la liste, puis chaque autre objet visé par chaque élément, et ainsi de suite: effectuer une copie en profondeur.
import copy
# each element must have __deepcopy__ defined for this...
new_list = copy.deepcopy(my_list)
Voir la documentation pour plus d'informations sur les cas de coin dans la copie.
Contrairement à d'autres langues qui ont variable et la valeur de, Python a nom et l'objet de.
Cette déclaration:
a =[1,2,3]
signifie donner la liste (objet) d'un nom de a, et, ce:
b = a
donne juste le même objet a un nouveau nom b, de sorte que chaque fois que vous faites quelque chose avec a, les modifications de l'objet et, par conséquent, b changements.
La seule façon de faire un vraiment copie de a est de créer un nouvel objet comme d'autres réponses ont déjà dit.
Tous les autres contributeurs ont donné grande réponses, qui travail lorsque vous avez une seule dimension (stabilisé) liste des méthodes mentionnées jusqu'à présent, seuls copy.deepcopy() œuvres de clone/copie d'une liste et de ne pas pointer vers le imbriquée list objets lorsque vous travaillez avec des dimensions, des listes imbriquées (liste de listes). Alors que Felix Kling y fait référence dans sa réponse, il y a un peu plus de la question et, éventuellement, une solution de contournement avec built-ins qui pourrait s'avérer une alternative plus rapide à deepcopy.
Tout new_list = old_list[:], copy.copy(old_list)' et pour Py3k old_list.copy() de travail pour un seul niveau de listes, ils reviennent à pointer à la list objets imbriqués dans la old_list et la new_list, et des modifications à la list objets sont perpétués dans les autres.
Edit: de Nouvelles informations portées à la lumière de
Comme l'a souligné à la fois Aaron Hall et PM 2Ringà l'aide de eval() n'est pas seulement une mauvaise idée, il est aussi beaucoup plus lent que copy.deepcopy().
Cela signifie que pour multidimensionnelle des listes, la seule option est copy.deepcopy(). Avec cela étant dit, ce n'est vraiment pas une option que la performance va vers le sud quand vous essayez de l'utiliser sur un de taille moyenne tableau multidimensionnel. J'ai essayé de timeit à l'aide d'un 42x42 tableau, pas rare de voire que les grands pour les applications de la bioinformatique, et j'ai renoncé à attendre une réponse et juste commencé à taper mon edit de ce post.
Il semblerait que la seule véritable option est d'initialiser plusieurs listes et de les travailler de manière indépendante. Si quelqu'un a d'autres suggestions, pour savoir comment gérer multidimensionnelle de la liste de copie, il serait apprécié.
Comme d'autres l'ont dit, il n'y sont importants des problèmes de performances à l'aide de la copy module et copy.deepcopypour multidimensionnelle des listes. en Essayant de travailler avec une façon différente de la copie de la multidimensionnel de la liste sans l'aide de deepcopy, (je travaillais sur un problème pour un cours qui ne permet que 5 secondes pour l'ensemble de l'algorithme à exécuter afin de recevoir un crédit), j'ai trouvé un moyen d'utiliser les fonctions intégrées de faire une copie de la liste imbriquée sans les avoir point à un autre ou à l' list objets imbriqués à l'intérieur d'eux. J'ai utilisé eval() et repr() dans l'attribution à faire de la copie de l'ancienne liste dans la nouvelle liste sans la création d'un lien avec l'ancienne liste. Elle prend la forme de:
new_list = eval(repr(old_list))
Fondamentalement, ce que cela fait, c'est de faire une représentation de old_list comme une chaîne, puis évalue la chaîne, comme si elle était l'objet de la chaîne représente. Ce faisant, aucun lien vers l'original list objet. Une nouvelle list objet est créé et chaque variable de points à son propre objet. Voici un exemple en utilisant un 2 dimensions liste imbriquée.
old_list =[[0for j in range(y)]for i in range(x)]# initialize (x,y) nested list# assign a copy of old_list to new list without them pointing to the same list object
new_list = eval(repr(old_list))# make a change to new_list for j in range(y):for i in range(x):
new_list[i][j]+=1
Si vous vérifiez ensuite le contenu de chaque liste, par exemple un 4 par 3 de la liste, Python sera de retour
Alors que ce n'est probablement pas le canoniques ou syntaxiquement correct de le faire, il semble bien fonctionner. Je n'ai pas testé les performances, mais je vais deviner que eval() et rep() aura moins de frais généraux que les deepcopy volonté.
Cela ne fonctionne pas toujours, car il n'y a aucune garantie que la chaîne de caractères retournée par repr() est suffisante pour re-créer l'objet. Aussi, eval() est un outil de dernier recours; voir Eval est vraiment dangereux par le vétéran de Ned Batchelder pour plus de détails. Ainsi, lorsque vous préconisent l'utilisation eval() vous vraiment convient de mentionner qu'il peut être dangereux. Juste point de. Même si je pense qu'Batchelder point est que le devoir de la eval() fonction en Python, en général, est un risque. Ce n'est pas tant de savoir si ou de ne pas vous rendre l'utilisation de la fonction dans le code, mais qu'il est un trou de sécurité dans Python dans et de lui-même. Mon exemple n'est pas de l'utiliser avec une fonction qui reçoit en entrée de input(), sys.agrv, ou même un fichier texte. C'est plus le long des lignes de l'initialisation d'un vide multidimensionnelle de la liste une fois, et puis juste avoir un moyen de le copier dans une boucle au lieu de réinitialiser à chaque itération de la boucle. @AaronHall l'a souligné, il y a probablement un important problème de performance à l'aide de new_list = eval(repr(old_list)), ainsi, en plus d'être une mauvaise idée, il est aussi probablement trop lent pour travailler.
Commençons par le début et explorer un peu profonde :
Donc, Supposons que vous avez deux liste :
list_1=['01','98']
list_2=[['01','98']]
Et nous avons de copier la liste , maintenant à partir de la première liste:
Donc d'abord laissez-vous tenter par la méthode générale de la copie:
copy=list_1
Maintenant, si vous pensez exemplaire copié le list_1 alors vous peut-être tort, nous allons le vérifier:
The id() function shows us that both variables point to the same list object, i.e. they share this object.
print(id(copy))print(id(list_1))
de sortie:
43294853204329485320
Surpris ? Ok, nous allons explorer:
Donc, comme nous le savons python ne rien stocker dans une variable, les Variables sont simplement référence à l'objet et de l'objet de stocker la valeur. Ici l'objet est list, mais nous avons créé deux références à ce même objet par deux différents noms de variables. De sorte que les deux variables pointent vers le même objet :
ainsi, lorsque vous vous copy=list_1 ce qui en fait sa fait :
Ici dans l'image list_1 et de copie sont deux noms de variables, mais l'objet est de même pour les deux variables qui est list
Donc, si vous essayez de modifier la liste copiée puis il va modifier la liste originale aussi parce que la liste est seul là-bas, vous pourrez modifier cette liste, peu importe que vous faire à partir de la liste copiée ou à partir de la liste d'origine:
copy[0]="modify"print(copy)print(list_1)
de sortie:
['modify','98']['modify','98']
Donc modifié la liste d'origine :
Quelle est la solution alors?
Solution :
Maintenant, nous allons passer à une deuxième pythonic méthode de la copie de la liste:
copy_1=list_1[:]
Maintenant cette méthode de réparer la chose, ce que nous faisions face à la première question nous allons le vérifier :
Ainsi, comme nous pouvons le voir à notre liste de différents id et cela signifie que les deux variables pointent vers des objets différents, donc ce qui se passe ici est :
Maintenant, nous allons essayer de modifier la liste et nous allons voir si nous sommes encore confrontés au problème précédent :
copy_1[0]="modify"print(list_1)print(copy_1)
De sortie:
['01','98']['modify','98']
Donc, comme vous pouvez le voir, il n'est pas la modification de la liste d'origine, il a seulement modifié la liste copiée, nous sommes Donc d'accord avec elle.
Alors maintenant, je pense que nous sommes fait? attendez que nous avons à copier la deuxième liste imbriquée trop essayons donc pythonic façon :
copy_2=list_2[:]
Tellement fine list_2 devrait faire référence à un autre objet qui est la copie de fine list_2 nous allons vérifier:
print(id((list_2)),id(copy_2))
nous obtenir la sortie:
43304035924330403528
Maintenant, nous pouvons supposer que les deux listes sont en pointant l'objet est différent maintenant, nous allons essayer de le modifier, et nous allons voir qu'il est de donner ce que nous voulons :
Ainsi, lorsque nous essayons:
copy_2[0][1]="modify"print(list_2,copy_2)
il nous donne de sortie:
[['01','modify']][['01','modify']]
Maintenant, c'est peu déroutant, nous avons utilisé le pythonic façon et encore, nous sommes confrontés au même problème.
nous allons le comprendre:
Donc, quand nous faisons :
copy_2=list_2[:]
nous sommes en fait la copie de la liste externe uniquement, et non de la liste imbriquée, donc liste imbriquée est même objet pour les deux listes, nous allons vérifier:
print(id(copy_2[0]))print(id(list_2[0]))
de sortie:
43294858324329485832
Donc en fait, quand nous ne copy_2=list_2[:] c'est ce qui se passe:
Il crée une copie de la liste, mais seulement extérieure de la liste de copie, pas la liste imbriquée copie, liste imbriquée est de même pour les deux variables, donc si vous essayez de modifier la liste imbriquée puis il va modifier la liste originale aussi parce que la liste imbriquée objet est de même pour les deux liste imbriquée.
Quelle est donc la solution?
Solution est deep copy
from copy import deepcopy
deep=deepcopy(list_2)
Maintenant, nous allons le vérifier :
print(id((list_2)),id(deep))
de sortie:
43221460564322148040
les deux id différents , maintenant, nous allons vérifier la liste imbriquée id:
print(id(deep[0]))print(id(list_2[0]))
de sortie:
43221459924322145800
Comme vous pouvez le voir à la fois les id sont différentes, donc on peut supposer que les deux imbriqués liste de pointage de l'objet est différent maintenant.
Ainsi, lorsque vous vous deep=deepcopy(list_2) ce qui se passe réellement :
De sorte que les deux liste imbriquée sont orientées objet différent et ils ont seprate copie de la liste imbriquée maintenant.
Maintenant, nous allons essayer de modifier la liste imbriquée et nous allons voir si cela a résolu le problème précédent, ou pas:
donc si nous faisons :
deep[0][1]="modify"print(list_2,deep)
de sortie:
[['01','98']][['01','modify']]
Donc, comme vous pouvez le voir, il n'a pas modifier l'original de la liste imbriquée , il a seulement modifié la liste copiée.
Si vous aimez ma réponse , laissez-moi savoir par upvoting ,
si vous avez le moindre doute à cette réponse , un commentaire en bas 🙂
Voici les résultats du réglage à l'aide de Python 3.6.0. Gardez à l'esprit ces temps sont relatifs l'un à l'autre, et non pas absolue.
J'ai collé à ne faire que peu profonde exemplaires, et a également ajouté quelques nouvelles méthodes qui n'étaient pas possibles en Python2, comme list.copy() (Python3 tranche équivalent) et liste déballage (*new_list, = list):
METHOD TIME TAKEN
b = a[:]6.468942025996512#Python2 winner
b = a.copy()6.986593422974693#Python3 "slice equivalent"
b =[]; b.extend(a)7.309216841997113
b = a[0:len(a)]10.916740721993847*b,= a 11.046738261007704
b = list(a)11.761539687984623
b =[i for i in a]24.66165203397395
b = copy.copy(a)30.853400873980718
b =[]for item in a:
b.append(item)48.19176080400939
On peut voir l'ancien vainqueur sort toujours sur le dessus, mais pas vraiment par une quantité énorme, compte tenu de l'augmentation de la lisibilité de la Python3 list.copy() approche.
Noter que ces méthodes ne pas de sortie des résultats équivalents pour toute entrée autres que les listes. Ils travaillent tous pour peut être tranché objets, un peu de travail pour n'importe quel itérable, mais seulement copy.copy() fonctionne pour n'importe quel objet Python.
Ils semblent avoir optimisé le list initialiseur en Python 3.6.1. Je n'ai pas de Python 3.6.0 l'installation, mais b = list(a) obtient 2.7 et b = a[:] obtient 3.1, et b = a.copy() obtient 3.1 (Sur mon Windows et Linux Disponible 3.6.1), de sorte list() est environ 10% plus rapide J'ai testé à nouveau avec Python 3.6.3 (WSL 16.04) et a obtenu fondamentalement le même ordre
L'inconvénient évident de cette méthode est qu'il est uniquement disponible en Python 3.5+.
Calendrier sage cependant, cela semble mieux fonctionner que d'autres méthodes communes.
x =[random.random()for _ in range(1000)]%timeit a = list(x)%timeit a = x.copy()%timeit a = x[:]%timeit a =[*x]#: 2.47 µs ± 38.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)#: 2.47 µs ± 54.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)#: 2.39 µs ± 58.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)#: 2.22 µs ± 43.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Comment fonctionne cette méthode se comporter lors de la modification des copies? voulez-vous dire en ajoutant ou des éléments de montage de la nouvelle liste. Dans l'exemple old_list et new_list sont deux listes différentes, le montage d'une volonté de ne pas changer l'autre (sauf si vous êtes directement la mutation des éléments eux-mêmes (comme la liste de la liste), aucune de ces méthodes sont profondes des copies). Ouais, je voulais dire si l'édition de l'un affecte l'autre. Merci.
Ne sais pas si c'est toujours d'actualité, mais le même comportement est pour les dictionnaires. Regardez cet exemple.
a ={'par':[1,21,3],'sar':[5,6,8]}
b = a
c = a.copy()
a['har']=[1,2,3]
a
Out[14]:{'har':[1,2,3],'par':[1,21,3],'sar':[5,6,8]}
b
Out[15]:{'har':[1,2,3],'par':[1,21,3],'sar':[5,6,8]}
c
Out[16]:{'par':[1,21,3],'sar':[5,6,8]}
Noter qu'il existe certains cas où si vous avez défini votre propre classe personnalisée et que vous souhaitez conserver les attributs, alors vous devriez utiliser copy.copy() ou copy.deepcopy() plutôt que les solutions de rechange, par exemple en Python 3:
import copy
classMyList(list):pass
lst =MyList([1,2,3])
lst.name ='custom list'
d ={'original': lst,'slicecopy': lst[:],'lstcopy': lst.copy(),'copycopy': copy.copy(lst),'deepcopy': copy.deepcopy(lst)}for k,v in d.items():print('lst: {}'.format(k), end=', ')try:
name = v.name
exceptAttributeError:
name ='NA'print('name: {}'.format(name))
Sorties:
lst: original, name: custom list
lst: slicecopy, name: NA
lst: lstcopy, name: NA
lst: copycopy, name: custom list
lst: deepcopy, name: custom list
Une approche très simple indépendant de la version de python manquait déjà donné les réponses que vous pouvez utiliser la plupart du temps (au moins je le fais):
new_list = my_list *1#Solution 1 when you are not using nested lists
Toutefois, Si my_list contient d'autres conteneurs (pour exemple. listes imbriquées), vous devez utiliser la propriétédeepcopy que d'autres ont suggéré dans les réponses ci-dessus à partir de la copie de la bibliothèque. Par exemple:
import copy
new_list = copy.deepcopy(my_list)#Solution 2 when you are using nested lists
.Bonus: Si vous ne voulez pas copier des éléments d'utilisation (aka shallow copy):
new_list = my_list[:]
Nous allons comprendre la différence entre la Solution n ° 1 et la Solution #2
>>> a = range(5)>>> b = a*1>>> a,b
([0,1,2,3,4],[0,1,2,3,4])>>> a[2]=55>>> a,b
([0,1,55,3,4],[0,1,2,3,4])
Comme vous pouvez le voir Solution n ° 1 a parfaitement fonctionné, quand nous n'étions pas à l'aide de la listes imbriquées. Nous allons vérifier ce qui se passera quand nous appliquer la solution n ° 1 pour des listes imbriquées.
>>>from copy import deepcopy
>>> a =[range(i,i+4)for i in range(3)]>>> a
[[0,1,2,3],[1,2,3,4],[2,3,4,5]]>>> b = a*1>>> c = deepcopy(a)>>>for i in(a, b, c):print i
[[0,1,2,3],[1,2,3,4],[2,3,4,5]][[0,1,2,3],[1,2,3,4],[2,3,4,5]][[0,1,2,3],[1,2,3,4],[2,3,4,5]]>>> a[2].append('99')>>>for i in(a, b, c):print i
[[0,1,2,3],[1,2,3,4],[2,3,4,5,99]][[0,1,2,3],[1,2,3,4],[2,3,4,5,99]]#Solution#1 didn't work in nested list[[0,1,2,3],[1,2,3,4],[2,3,4,5]]#Solution #2 - DeepCopy worked in nested list
new_list = my_list
Essayer de comprendre cela. Disons que my_list est dans le segment de mémoire à l'emplacement X c'est à dire my_list pointe sur le symbole X. Maintenant, en attribuant new_list = my_list vous êtes Laissant new_list pointant vers le X. Ceci est connu comme la Copie superficielle.
Maintenant, si vous affectez new_list = my_list[:] Vous êtes tout simplement la copie de chaque objet de my_list à new_list. Ceci est connu en tant que copie en Profondeur.
L'Autre manière que vous pouvez faire sont les suivantes :
Vous souhaitez utiliser propriétédeepcopy de l'python standard library.
En python, lorsque vous copiez un type de données, l'original et la copie de types de données partagent les mêmes emplacements de mémoire. Par conséquent, toutes les modifications apportées à une copie de l'objet se reflète dans l'objet d'origine. Par exemple, considérez ceci:
my_lst=[1,2,3,4,5]#Python listprint my_lst,' my_lst (before copy)'
my_lst_copy = my_lst=[1,2,3,4,5]#Simple copy of python list
my_lst_copy[2]=55#Copy of python list changedprint my_lst_copy,' my_lst_copy (copy of python list)'print my_lst,' my_lst (after copy)'>>>[1,2,3,4,5] my_lst (before copy)>>>[1,2,55,4,5] my_lst_copy (copy of python list)>>>[1,2,55,4,5] my_lst (after copy)
Comme vous l'aviez remarqué avant, et que vous remarquez à nouveau dans l'exemple ci-dessus, le changement dans n'importe quel élément de la liste copiée my_list_cp les modifications de la liste d'origine my_list. La raison pour cela est que est que il n'y a pas eu de nouvelle attribution de my_list_cp.
Vous pouvez lutter contre le ci-dessus en utilisant propriétédeepcopy de l'python standard library. En copie, une copie de l'objet est copié dans un autre objet.
from copy import deepcopy
my_lst=[1,2,3,4,5]#Python listprint my_lst,' my_lst (before copy)'
my_lst_copy = deepcopy(my_lst)#Python list copied
my_lst_copy[2]=55#Copy of python list changedprint my_lst_copy,' my_lst_copy (copy of python list)'print my_lst,' my_lst (after copy)'>>>[1,2,3,4,5] my_lst (before copy)>>>[1,2,55,4,5] my_lst_copy (copy of python list)>>>[1,2,3,4,5] my_lst (after copy)
Dans l'exemple ci-dessus, vous voyez que my_lst n'a pas changé après la copie.
Avec
new_list = my_list
, vous n'avez pas réellement avoir deux listes. L'affectation copie simplement la référence à la liste, pas le liste, de sorte que les deuxnew_list
etmy_list
reportez-vous à la liste après la cession.À copier la liste, vous avez différentes possibilités:
Vous pouvez utiliser la builtin
liste.copier()
méthode (disponible depuis le python 3.3):Vous pouvez le couper en tranches:
Alex Martelli est avis (au moins en 2007) à ce sujet est, que il est bizarre de syntaxe et il ne fait pas de sens pour l'utiliser jamais. 😉 (Dans son avis, le suivant est plus lisible).
Vous pouvez utiliser le construit en
list()
fonction:Vous pouvez utiliser générique
copier.copier()
:C'est un peu plus lent que
list()
parce qu'il doit trouver le type de données deold_list
premier.Si la liste contient des objets et que vous voulez les copier ainsi, l'utilisation générique
copier.propriétédeepcopy()
:Évidemment, le plus lent et le plus de mémoire qui ont besoin de méthode, mais parfois inévitable.
Exemple:
Résultat:
Si je ne suis pas d'erreur possible :
newlist = [*mylist]
est aussi une possibilité en Python 3.newlist = list(mylist)
est peut-être plus clair.une autre possibilité est new_list = old_list * 1
Laquelle de ces méthodes sont la copie superficielle et qui sont des copie en profondeur?
tous, sauf le dernier de faire une copie
OriginalL'auteur Felix Kling
Felix déjà fourni une excellente réponse, mais je pensais faire une comparaison de la vitesse des différentes méthodes:
copier.propriétédeepcopy(old_list)
Copy()
méthode de copie des classes avec propriétédeepcopyCopy()
méthode ne copie pas les classes (seulement dicts/lists/n-uplets)for item in old_list: new_list.append(item)
[i for i in old_list]
(un compréhension de liste)copier.copier(old_list)
list(old_list)
new_list = []; new_list.extend(old_list)
old_list[:]
(liste de découpage)Donc la plus rapide est la liste de découpage. Mais sachez que
copy.copy()
,list[:]
etlist(list)
, contrairement àcopy.deepcopy()
et la version de python n'avez pas de copie de toutes les listes, les dictionnaires et les instances de classe dans la liste, donc si les originaux changement, ils vont changer dans la liste copiée aussi, et vice versa.(Voici le script si quelqu'un est intéressé ou veut soulever des questions:)
MODIFIER: Ajout de nouvelles de style à l'ancienne, des classes de style et dicts les benchmarks, et fait de la version de python beaucoup plus rapide et ajouté un peu plus de méthodes, y compris la liste d'expressions et de
extend()
.utiliser le
timeit
module. aussi, vous ne pouvez pas les conclusions de l'arbitraire micro repères comme ça.Si vous souhaitez inclure une nouvelle option pour 3.5+,
[*old_list]
doit être à peu près équivalent àlist(old_list)
, mais depuis c'est de la syntaxe, pas général de l'appel de la fonction des voies, il vous permettra de gagner un peu de l'exécution (et contrairement àold_list[:]
, qui n'a pas de type de convertir,[*old_list]
fonctionne sur n'importe quel itérable et produit unlist
).OriginalL'auteur cryo
J'ai été dit que Python 3.3,+ ajoute
liste.copier()
méthode, qui doit être aussi rapide que le découpage:newlist = old_list.copy()
s.copy()
crée une copie des
(le même ques[:]
).OriginalL'auteur anatoly techtonik
En Python 3, une copie peut être faite avec:
En Python 2 et 3, vous pouvez obtenir une copie superficielle avec un tranche de l'original:
Explication
Il y a deux sémantique manières de copier une liste. Une copie crée une nouvelle liste des objets de même, une copie en profondeur crée une nouvelle liste contenant les nouvelles équivalent objets.
Peu profonde de la liste de copie
D'une copie des copies de la liste elle-même, qui est un conteneur de références aux objets dans la liste. Si les objets contenus eux-mêmes sont mutables et est changée, le changement pourra être répercuté dans les deux listes.
Il y a différentes façons de le faire en Python 2 et 3. Le Python 2 façons travaillera également en Python 3.
Python 2
En Python 2, le idiomatiques façon de faire une copie de la liste avec une tranche de l'original:
Vous pouvez également faire la même chose en passant par la liste par le biais de la liste de constructeur,
mais en utilisant le constructeur est de moins en moins efficace:
Python 3
En Python 3, les listes d'obtenir le
list.copy
méthode:En Python 3.5:
De faire un autre pointeur ne pas faire une copie
my_list
est juste un nom qui points à la liste actuelle dans la mémoire. Quand vous ditesnew_list = my_list
vous n'êtes pas en faire une copie, vous êtes juste ajouter un autre nom à cette liste d'origine dans la mémoire. Nous pouvons avoir des problèmes similaires lorsque nous faisons des copies de listes.La liste est juste un tableau de pointeurs vers du contenu, donc d'une copie simple copie seulement les pointeurs, et vous avez donc deux listes différentes, mais elles ont le même contenu. Faire des copies du contenu, vous avez besoin d'une copie en profondeur.
Profonde des copies
De faire un copie d'une liste en Python 2 ou 3, utilisez
propriétédeepcopy
dans lecopier
module:Pour montrer comment cela nous permet de faire de nouveaux sous-listes:
Et nous voyons donc que la profondeur copié liste est une liste différente de l'original. Vous pourriez rouler votre propre fonction, mais n'en ont pas. Vous êtes susceptibles de créer des bugs que vous n'avez pas normalement à l'aide de la bibliothèque standard du propriétédeepcopy fonction.
Ne pas utiliser
eval
Vous pouvez voir ce utilisé comme un moyen de propriétédeepcopy, mais ne le faites pas:
En 64 bits Python 2.7:
sur 64 bits Python 3.5:
list_copy=[]
for item in list: list_copy.append(copy(item))
et il est beaucoup plus rapide.OriginalL'auteur Aaron Hall
Il y a beaucoup de réponses déjà que vous dire comment faire une bonne copie, mais aucun d'entre eux disent pourquoi l'original de votre "copie" a échoué.
Python ne pas stocker des valeurs dans des variables; il se lie à des noms aux objets. Votre affectation d'origine a pris de l'objet visé par
my_list
et lié ànew_list
. Peu importe le nom que vous utilisez, il est toujours qu'une seule liste, de sorte que les modifications apportées lorsque l'on se réfère à elle commemy_list
persiste lorsque l'on se réfère à elle commenew_list
. Chacun des autres réponses à cette question vous donne différentes façons de créer un nouvel objet à lier ànew_list
.Chaque élément d'une liste des actes comme un nom, en ce que chaque élément se lie non exclusivement à un objet. Une copie crée une nouvelle liste dont les éléments se lient aux mêmes objets comme avant.
De prendre votre liste de copie un peu plus loin, copie de chaque objet votre liste se réfère, et lient ces élément copies à une nouvelle liste.
Ce n'est pas encore une copie en profondeur, parce que chaque élément d'une liste peut se référer à d'autres objets, tout comme la liste est lié à l'un de ses éléments. De façon récursive copie de chaque élément dans la liste, puis chaque autre objet visé par chaque élément, et ainsi de suite: effectuer une copie en profondeur.
Voir la documentation pour plus d'informations sur les cas de coin dans la copie.
OriginalL'auteur jack
new_list = list(old_list)
OriginalL'auteur user285176
Utilisation
thing[:]
OriginalL'auteur Paul Tarjan
Python est un langage pour le faire, c'est
newList = oldList[:]
OriginalL'auteur erisco
Contrairement à d'autres langues qui ont variable et la valeur de, Python a nom et l'objet de.
Cette déclaration:
signifie donner la liste (objet) d'un nom de
a
, et, ce:donne juste le même objet
a
un nouveau nomb
, de sorte que chaque fois que vous faites quelque chose aveca
, les modifications de l'objet et, par conséquent,b
changements.La seule façon de faire un vraiment copie de a est de créer un nouvel objet comme d'autres réponses ont déjà dit.
Vous pouvez en savoir plus sur cette ici.
OriginalL'auteur Statham
Tous les autres contributeurs ont donné grande réponses, qui travail lorsque vous avez une seule dimension (stabilisé) liste des méthodes mentionnées jusqu'à présent, seuls
copy.deepcopy()
œuvres de clone/copie d'une liste et de ne pas pointer vers le imbriquéelist
objets lorsque vous travaillez avec des dimensions, des listes imbriquées (liste de listes). Alors que Felix Kling y fait référence dans sa réponse, il y a un peu plus de la question et, éventuellement, une solution de contournement avec built-ins qui pourrait s'avérer une alternative plus rapide àdeepcopy
.Tout
new_list = old_list[:]
,copy.copy(old_list)'
et pour Py3kold_list.copy()
de travail pour un seul niveau de listes, ils reviennent à pointer à lalist
objets imbriqués dans laold_list
et lanew_list
, et des modifications à lalist
objets sont perpétués dans les autres.Edit: de Nouvelles informations portées à la lumière de
Comme d'autres l'ont dit, il n'y
sont importants des problèmes de performances à l'aide de lacopy
module etcopy.deepcopy
pour multidimensionnelle des listes.en Essayant de travailler avec une façon différente de la copie de la multidimensionnel de la liste sans l'aide dedeepcopy
, (je travaillais sur un problème pour un cours qui ne permet que 5 secondes pour l'ensemble de l'algorithme à exécuter afin de recevoir un crédit), j'ai trouvé un moyen d'utiliser les fonctions intégrées de faire une copie de la liste imbriquée sans les avoir point à un autre ou à l'list
objets imbriqués à l'intérieur d'eux. J'ai utiliséeval()
etrepr()
dans l'attribution à faire de la copie de l'ancienne liste dans la nouvelle liste sans la création d'un lien avec l'ancienne liste. Elle prend la forme de:Fondamentalement, ce que cela fait, c'est de faire une représentation de
old_list
comme une chaîne, puis évalue la chaîne, comme si elle était l'objet de la chaîne représente. Ce faisant, aucun lien vers l'originallist
objet. Une nouvellelist
objet est créé et chaque variable de points à son propre objet. Voici un exemple en utilisant un 2 dimensions liste imbriquée.Si vous vérifiez ensuite le contenu de chaque liste, par exemple un 4 par 3 de la liste, Python sera de retour
Alors que ce n'est probablement pas le canoniques ou syntaxiquement correct de le faire, il semble bien fonctionner. Je n'ai pas testé les performances, mais je vais deviner queeval()
etrep()
aura moins de frais généraux que lesdeepcopy
volonté.repr()
est suffisante pour re-créer l'objet. Aussi,eval()
est un outil de dernier recours; voir Eval est vraiment dangereux par le vétéran de Ned Batchelder pour plus de détails. Ainsi, lorsque vous préconisent l'utilisationeval()
vous vraiment convient de mentionner qu'il peut être dangereux.Juste point de. Même si je pense qu'Batchelder point est que le devoir de la
eval()
fonction en Python, en général, est un risque. Ce n'est pas tant de savoir si ou de ne pas vous rendre l'utilisation de la fonction dans le code, mais qu'il est un trou de sécurité dans Python dans et de lui-même. Mon exemple n'est pas de l'utiliser avec une fonction qui reçoit en entrée deinput()
,sys.agrv
, ou même un fichier texte. C'est plus le long des lignes de l'initialisation d'un vide multidimensionnelle de la liste une fois, et puis juste avoir un moyen de le copier dans une boucle au lieu de réinitialiser à chaque itération de la boucle.@AaronHall l'a souligné, il y a probablement un important problème de performance à l'aide de
new_list = eval(repr(old_list))
, ainsi, en plus d'être une mauvaise idée, il est aussi probablement trop lent pour travailler.OriginalL'auteur AMR
Donc, Supposons que vous avez deux liste :
Et nous avons de copier la liste , maintenant à partir de la première liste:
Donc d'abord laissez-vous tenter par la méthode générale de la copie:
Maintenant, si vous pensez exemplaire copié le list_1 alors vous peut-être tort, nous allons le vérifier:
de sortie:
Surpris ? Ok, nous allons explorer:
Donc, comme nous le savons python ne rien stocker dans une variable, les Variables sont simplement référence à l'objet et de l'objet de stocker la valeur. Ici l'objet est
list
, mais nous avons créé deux références à ce même objet par deux différents noms de variables. De sorte que les deux variables pointent vers le même objet :ainsi, lorsque vous vous
copy=list_1
ce qui en fait sa fait :Ici dans l'image list_1 et de copie sont deux noms de variables, mais l'objet est de même pour les deux variables qui est
list
Donc, si vous essayez de modifier la liste copiée puis il va modifier la liste originale aussi parce que la liste est seul là-bas, vous pourrez modifier cette liste, peu importe que vous faire à partir de la liste copiée ou à partir de la liste d'origine:
de sortie:
Donc modifié la liste d'origine :
Maintenant, nous allons passer à une deuxième pythonic méthode de la copie de la liste:
Maintenant cette méthode de réparer la chose, ce que nous faisions face à la première question nous allons le vérifier :
Ainsi, comme nous pouvons le voir à notre liste de différents id et cela signifie que les deux variables pointent vers des objets différents, donc ce qui se passe ici est :
Maintenant, nous allons essayer de modifier la liste et nous allons voir si nous sommes encore confrontés au problème précédent :
De sortie:
Donc, comme vous pouvez le voir, il n'est pas la modification de la liste d'origine, il a seulement modifié la liste copiée, nous sommes Donc d'accord avec elle.
Alors maintenant, je pense que nous sommes fait? attendez que nous avons à copier la deuxième liste imbriquée trop essayons donc pythonic façon :
Tellement fine list_2 devrait faire référence à un autre objet qui est la copie de fine list_2 nous allons vérifier:
nous obtenir la sortie:
Maintenant, nous pouvons supposer que les deux listes sont en pointant l'objet est différent maintenant, nous allons essayer de le modifier, et nous allons voir qu'il est de donner ce que nous voulons :
Ainsi, lorsque nous essayons:
il nous donne de sortie:
Maintenant, c'est peu déroutant, nous avons utilisé le pythonic façon et encore, nous sommes confrontés au même problème.
nous allons le comprendre:
Donc, quand nous faisons :
nous sommes en fait la copie de la liste externe uniquement, et non de la liste imbriquée, donc liste imbriquée est même objet pour les deux listes, nous allons vérifier:
de sortie:
Donc en fait, quand nous ne
copy_2=list_2[:]
c'est ce qui se passe:Il crée une copie de la liste, mais seulement extérieure de la liste de copie, pas la liste imbriquée copie, liste imbriquée est de même pour les deux variables, donc si vous essayez de modifier la liste imbriquée puis il va modifier la liste originale aussi parce que la liste imbriquée objet est de même pour les deux liste imbriquée.
Quelle est donc la solution?
Solution est
deep copy
Maintenant, nous allons le vérifier :
de sortie:
les deux id différents , maintenant, nous allons vérifier la liste imbriquée id:
de sortie:
Comme vous pouvez le voir à la fois les id sont différentes, donc on peut supposer que les deux imbriqués liste de pointage de l'objet est différent maintenant.
Ainsi, lorsque vous vous
deep=deepcopy(list_2)
ce qui se passe réellement :De sorte que les deux liste imbriquée sont orientées objet différent et ils ont seprate copie de la liste imbriquée maintenant.
Maintenant, nous allons essayer de modifier la liste imbriquée et nous allons voir si cela a résolu le problème précédent, ou pas:
donc si nous faisons :
de sortie:
Donc, comme vous pouvez le voir, il n'a pas modifier l'original de la liste imbriquée , il a seulement modifié la liste copiée.
Si vous aimez ma réponse , laissez-moi savoir par upvoting ,
si vous avez le moindre doute à cette réponse , un commentaire en bas 🙂
OriginalL'auteur Aaditya Ura
Python 3.6.0 Timings
Voici les résultats du réglage à l'aide de Python 3.6.0. Gardez à l'esprit ces temps sont relatifs l'un à l'autre, et non pas absolue.
J'ai collé à ne faire que peu profonde exemplaires, et a également ajouté quelques nouvelles méthodes qui n'étaient pas possibles en Python2, comme
list.copy()
(Python3 tranche équivalent) et liste déballage (*new_list, = list
):On peut voir l'ancien vainqueur sort toujours sur le dessus, mais pas vraiment par une quantité énorme, compte tenu de l'augmentation de la lisibilité de la Python3
list.copy()
approche.Noter que ces méthodes ne pas de sortie des résultats équivalents pour toute entrée autres que les listes. Ils travaillent tous pour peut être tranché objets, un peu de travail pour n'importe quel itérable, mais seulement
copy.copy()
fonctionne pour n'importe quel objet Python.Voici le code de test pour les parties intéressées (Modèle à partir d'ici):
list
initialiseur en Python 3.6.1. Je n'ai pas de Python 3.6.0 l'installation, maisb = list(a)
obtient2.7
etb = a[:]
obtient3.1
, etb = a.copy()
obtient3.1
(Sur mon Windows et Linux Disponible 3.6.1), de sortelist()
est environ 10% plus rapideJ'ai testé à nouveau avec Python 3.6.3 (WSL 16.04) et a obtenu fondamentalement le même ordre
OriginalL'auteur River
Ça m'étonne que cela n'a pas encore été mentionnés, pour le bien de l'exhaustivité...
Vous pouvez effectuer la liste déballage avec le "splat opérateur":
*
, qui sera également copier des éléments de votre liste.L'inconvénient évident de cette méthode est qu'il est uniquement disponible en Python 3.5+.
Calendrier sage cependant, cela semble mieux fonctionner que d'autres méthodes communes.
voulez-vous dire en ajoutant ou des éléments de montage de la nouvelle liste. Dans l'exemple
old_list
etnew_list
sont deux listes différentes, le montage d'une volonté de ne pas changer l'autre (sauf si vous êtes directement la mutation des éléments eux-mêmes (comme la liste de la liste), aucune de ces méthodes sont profondes des copies).Ouais, je voulais dire si l'édition de l'un affecte l'autre. Merci.
OriginalL'auteur SCB
Ne sais pas si c'est toujours d'actualité, mais le même comportement est pour les dictionnaires. Regardez cet exemple.
OriginalL'auteur Bobesh
Noter qu'il existe certains cas où si vous avez défini votre propre classe personnalisée et que vous souhaitez conserver les attributs, alors vous devriez utiliser
copy.copy()
oucopy.deepcopy()
plutôt que les solutions de rechange, par exemple en Python 3:Sorties:
OriginalL'auteur Chris_Rands
Une approche très simple indépendant de la version de python manquait déjà donné les réponses que vous pouvez utiliser la plupart du temps (au moins je le fais):
Toutefois, Si my_list contient d'autres conteneurs (pour exemple. listes imbriquées), vous devez utiliser la propriétédeepcopy que d'autres ont suggéré dans les réponses ci-dessus à partir de la copie de la bibliothèque. Par exemple:
.Bonus: Si vous ne voulez pas copier des éléments d'utilisation (aka shallow copy):
Nous allons comprendre la différence entre la Solution n ° 1 et la Solution #2
Comme vous pouvez le voir Solution n ° 1 a parfaitement fonctionné, quand nous n'étions pas à l'aide de la listes imbriquées. Nous allons vérifier ce qui se passera quand nous appliquer la solution n ° 1 pour des listes imbriquées.
OriginalL'auteur jainashish
vous pouvez utiliser bulit en fonction list ():
je pense que ce code va vous aider.
OriginalL'auteur Akash Nayak
new_list = my_list
Essayer de comprendre cela. Disons que my_list est dans le segment de mémoire à l'emplacement X c'est à dire my_list pointe sur le symbole X. Maintenant, en attribuant
new_list = my_list
vous êtes Laissant new_list pointant vers le X. Ceci est connu comme la Copie superficielle.Maintenant, si vous affectez
new_list = my_list[:]
Vous êtes tout simplement la copie de chaque objet de my_list à new_list. Ceci est connu en tant que copie en Profondeur.L'Autre manière que vous pouvez faire sont les suivantes :
new_list = list(old_list)
import copy
new_list = copy.deepcopy(old_list)
OriginalL'auteur Ravi Shankar
Vous souhaitez utiliser propriétédeepcopy de l'python standard library.
En python, lorsque vous copiez un type de données, l'original et la copie de types de données partagent les mêmes emplacements de mémoire. Par conséquent, toutes les modifications apportées à une copie de l'objet se reflète dans l'objet d'origine. Par exemple, considérez ceci:
Comme vous l'aviez remarqué avant, et que vous remarquez à nouveau dans l'exemple ci-dessus, le changement dans n'importe quel élément de la liste copiée
my_list_cp
les modifications de la liste d'originemy_list
. La raison pour cela est que est que il n'y a pas eu de nouvelle attribution demy_list_cp
.Vous pouvez lutter contre le ci-dessus en utilisant propriétédeepcopy de l'python standard library. En copie, une copie de l'objet est copié dans un autre objet.
Dans l'exemple ci-dessus, vous voyez que
my_lst
n'a pas changé après la copie.OriginalL'auteur Siddharth Satpathy
Vous pouvez utiliser la builtin
list.copy()
méthode (python 3.3 et+):https://docs.python.org/3/library/copy.html
new_list = old_list.copier()
OriginalL'auteur Brandon Bailey