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.
fonte
2014-04-21 16:01:59