Pour copier une liste: shallow_copy_of_list = old_list[:]
.
Pour copier un dict: shallow_copy_of_dict = dict(old_dict)
.
Mais pour un set
, je craignais qu'une chose similaire ne fonctionne pas, parce que dire new_set = set(old_set)
donnerait un ensemble d'un ensemble?
Mais, il fonctionne. Je poste donc la question et la réponse ici pour référence. Au cas où quelqu'un d'autre aurait la même confusion.
Les deux donneront un double d'un ensemble:
shallow_copy_of_set = set(old_set)
Ou:
shallow_copy_of_set = old_set.copy() #Which is more readable.
La raison pour laquelle la première manière ci-dessus ne donne pas donne un ensemble d'un ensemble, c'est que la syntaxe appropriée serait set([old_set])
. Ce qui ne fonctionnerait pas, parce que set
s ne peuvent pas être des éléments dans d'autres set
s, car ils sont inébranlables en raison de leur mutabilité. Cependant, ce n'est pas vrai pour frozenset
s, par exemple frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3])
.
Donc, une règle de base pour répliquer n'importe quelle instance des structures de données de base dans Python (listes, dict, set, frozenset, string):
a2 = list(a) #a is a list
b2 = set(b) #b is a set
c2 = dict(c) #c is a dict
d2 = frozenset(d) #d is a frozenset
e2 = str(e) #e is a string
#All of the above give a (shallow) copy.
Donc, si x
est l'un de ces types, alors
shallow_copy_of_x = type(x)(x) #Highly unreadable! But economical.
Notez que seuls dict
, set
et frozenset
ont la méthode copy()
intégrée. Ce serait probablement une bonne idée que les listes et les chaînes aient également une méthode copy()
, pour l'uniformité et la lisibilité. Mais ils ne le font pas, au moins dans Python 2.7.3 avec lequel je teste.
Outre le hack type(x)(x)
, vous pouvez importer le module copy
pour faire une copie superficielle ou une copie profonde:
In [29]: d={1: [2,3]}
In [30]: sd=copy.copy(d)
...: sd[1][0]=321
...: print d
{1: [321, 3]}
In [31]: dd=copy.deepcopy(d)
...: dd[1][0]=987
...: print dd, d
{1: [987, 3]} {1: [321, 3]}
De la docstring:
Definition: copy.copy(x)
Docstring:
Shallow copy operation on arbitrary Python objects.