2010-10-22 5 views
2

question simple Python:liste Python aide

liste Exemple: A = [1,2,3,4,5]

Je dois générer une autre liste B qui est une copie superficielle de la liste A tel que B est une nouvelle liste contenant les mêmes éléments dans le même ordre (pour que je puisse substituer un des éléments de B sans affecter A). Comment puis-je faire ceci?


clarification: Je veux faire quelque chose comme

def some_func(A) 
    B = {what do I do here to get a copy of A's elements?} 
    B[0] = some_other_func(B[0]) 
    yet_another_func(B) 

basé sur toutes vos réponses + les docs Python, une meilleure façon de faire ce que je veux est la suivante:

Merci de me pointer dans la bonne direction!
def some_func(A) 
    B = [some_other_func(A[0])] + A[1:] 
    yet_another_func(B) 

+4

Comment est cette copie superficielle? – codaddict

+0

Vous voulez une copie profonde comme JoshD mentionné. Vraiment nous a jetés là-bas! – birryree

+0

Juste ajouté une clarification. Je suis sûr que je veux peu profonde, pas une copie profonde. –

Répondre

5

Voici 3 façons de faire une copie de la liste A:

Utilisez la notation des tranches:

copy_of_A = A[:] 

Utilisez le constructeur de la liste:

copy_of_A = list(A) 

Utilisez le module de copie:

from copy import copy 
copy_of_A = copy(A) 

Comme vous avez demandé ces copies sont des copies peu profondes. Pour en savoir plus sur la différence entre une copie superficielle et une copie profonde, lisez le documentation of the copy module.

+1

+1 pour citer les documents de copie pour la terminologie. –

+0

@Jason S, je suppose que j'aurais dû être plus explicite avec mon lien :) Aussi +1. Bonne réponse. – JoshD

8

Ce serait une copie profonde, pas une copie superficielle.

Listes copie faible profondeur par défaut. C'est pourquoi il y a une commande deepcopy dans le copy module.

B = copy.deepcopy(A)

En option, B = A[:] fera. Mais gardez deepcopy à l'esprit pour l'avenir. Des types de données plus complexes peuvent en bénéficier.


Ajouté infos sur la copie:

Une copie superficielle:

b = [1,2] 
a = b 
b[0] = 11 
print a // [1,11] 

Une copie profonde:

b = [1,2] 
a = b[:] 
b[0] = 11 
print a // [1,2] 

Mais, en outre:

>>> a = [[1,2]] 
>>> b = a[:] 
>>> b 
[[1, 2]] 
>>> a 
[[1, 2]] 
>>> a[0][0] = 11 
>>> a 
[[11, 2]] 
>>> b 
[[11, 2]] 
>>> 

Ainsi, les éléments eux-mêmes sont des copies superficielles dans ce cas.

+0

+1 pour séparer les cheveux importants :-) –

+0

@Jason S, merci. J'ai appris quelque chose avec cette question. Donc +1 à toi aussi! – JoshD

3

B=A[:] suffit:

In [22]: A=[1,2] 

In [23]: B=A[:] 

In [24]: B[0]=100 

In [25]: A 
Out[25]: [1, 2] 

In [26]: B 
Out[26]: [100, 2] 

A[:] utilise la notation tranche pour obtenir la tranche avec tous les éléments de A. Depuis tranches de listes Python toujours retourner de nouvelles listes, vous obtenez une copie de A.

Notez que les éléments à l'intérieur de B sont identiques aux éléments à l'intérieur de A. Si les éléments sont mutables, leur mutation dans B affectera A.

+1

Je pense que nous devons tous clarifier quand nous voulons dire une copie superficielle de la liste et une copie superficielle des éléments de la liste. Quand j'entends une copie superficielle d'une liste, je pense à 'a = b'. Ce que vous avez fait, j'appellerais une copie profonde, même si les éléments eux-mêmes sont une copie superficielle, le _list_ est une copie profonde. – JoshD

+0

@JoshD: Je pense que vous avez raison, j'utilisais abusivement le terme "copie superficielle" comme défini ici: http://en.wikipedia.org/wiki/Shallow_copy#Shallow_copy – unutbu

+0

C'est une situation embarrassante parce que les deux se produisent. A est une copie profonde de B, mais A [0] est une copie superficielle de B [0]. Votre réponse actuelle est excellente et la clarifie parfaitement. +1 – JoshD

3

Comme ceci:

B = A[:] 
2
import copy 
A=[1,2,3,4,5] 
B=copy.copy(A) 
B[0]=9999 
print B[0] 
print A[0] 

import copy et utiliser copy.copy() pour la copie. voir this pour référence.

3

Vous pouvez effectuer cette copie de la manière suivante:

B = A[:]