2014-04-21 9 views
29

Zum Kopieren einer Liste: shallow_copy_of_list = old_list[:].Wie klonen oder kopieren Sie einen Satz in Python?

Zum Kopieren eines Diktats: shallow_copy_of_dict = dict(old_dict).

Aber für eine set, war ich besorgt, dass eine ähnliche Sache nicht funktionieren würde, weil das Sagen new_set = set(old_set) würde einen Satz eines Satzes geben?

Aber es funktioniert. Also stelle ich die Frage und die Antwort hier als Referenz. Für den Fall, dass jemand die gleiche Verwirrung hat.

shallow_copy_of_set = set(old_set) 

Oder:

Antwort

33

Beide werden ein Duplikat eines Satzes geben

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

Der Grund, dass der erste Weg über nicht einen Satz aus einem Satz geben tut, ist, dass die richtige Syntax dafür wäre set([old_set]). Was nicht funktionieren würde, weil set s keine Elemente in anderen set s sein können, weil sie aufgrund ihrer Veränderbarkeit nicht hashbar sind. Dies gilt jedoch nicht für frozensets, so z.B. frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3]).

So gilt die Faustregel für alle Instanz der grundlegenden Datenstrukturen in Python (Listen, dict, Set, frozenset, string) replizieren:

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. 

Also, wenn x ist eine dieser beiden Arten, dann

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

Beachten Sie, dass nur dict, set und frozenset die eingebaute in copy() Verfahren haben. Es wäre wahrscheinlich eine gute Idee, dass Listen und Strings auch eine copy() Methode für Einheitlichkeit und Lesbarkeit haben. Aber sie nicht, zumindest in Python 2.7.3, mit dem ich gerade teste.

7

Neben dem type(x)(x) hack, können Sie copy Modul importieren entweder flache Kopie oder tiefe Kopie zu machen:

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

Vom docstring:

Definition: copy.copy(x) 
Docstring: 
Shallow copy operation on arbitrary Python objects. 
Verwandte Themen