web-dev-qa-db-fra.com

Comment cloner ou copier un ensemble en Python?

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.

46
Evgeni Sergeev

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 sets ne peuvent pas être des éléments dans d'autres sets, car ils sont inébranlables en raison de leur mutabilité. Cependant, ce n'est pas vrai pour frozensets, 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.

50
Evgeni Sergeev

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.
10
zhangxaochen