2014-04-21 9 views
29

Per copiare un elenco: shallow_copy_of_list = old_list[:].Come clonare o copiare un set in Python?

Per copiare un dict: shallow_copy_of_dict = dict(old_dict).

Ma per un set, ero preoccupato che una cosa simile non avrebbe funzionato, perché dire new_set = set(old_set) darebbe un set di un set?

Ma funziona. Quindi sto postando la domanda e rispondo qui per riferimento. Nel caso in cui qualcun altro abbia la stessa confusione.

risposta

33

Entrambi questi vi darà un duplicato di un set:

shallow_copy_of_set = set(old_set) 

Oppure:

shallow_copy_of_set = old_set.copy() #Which is more readable. 

La ragione per cui la prima molto al di sopra non si invia un set di un set, è che la sintassi corretta per quello sarebbe set([old_set]). Che non funzionerebbe, perché set s non possono essere elementi di altri set s, perché sono dell'hash in virtù di essere mutevole. Tuttavia, questo non è vero per frozenset s, quindi ad es. frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3]).

Quindi una regola empirica per la replica di qualsiasi istanza di strutture di base di dati in Python (liste, 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. 

Quindi, se x è uno di quei tipi, poi

shallow_copy_of_x = type(x)(x) #Highly unreadable! But economical. 

Nota che solo dict, set e frozenset hanno il built-in copy() metodo. Probabilmente sarebbe una buona idea che liste e stringhe avessero anche un metodo copy(), per uniformità e leggibilità. Ma non lo fanno, almeno in Python 2.7.3 con cui sto testando.

7

Oltre al type(x)(x) hack, è possibile importare il modulo copy vivere il copia superficiale o profonda copia:

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]} 

Dal docstring:

Definition: copy.copy(x) 
Docstring: 
Shallow copy operation on arbitrary Python objects. 
Problemi correlati