2013-03-05 13 views
11

copy.copy() und copy.deepcopy() kopieren Sie einfach die Referenz für ein unveränderliches Objekt wie ein Tupel. Wie kann ich eine Kopie des ersten unveränderlichen Objekts an einem anderen Speicherort erstellen?Wie kann ich ein unveränderliches Objekt wie Tupel in Python kopieren?

+4

'oldtuple [:]' oder 'newtuple = tuple (oldtuple)' – Eevee

+12

warum müssen Sie es trotzdem kopieren, wenn es unveränderlich ist, dann sind Sie sicher, dass eine Referenz nicht gut genug ist? – wim

+1

@wim Wahr. Ich habe erwartet, dass jemand das fragt. Aber gibt es noch einen Weg? –

Antwort

16

das leere Tupel es hinzufügen:

>>> a = (1, 2, 3) 
>>> a is a+tuple() 
False 

verketten Tupel immer eine neue eindeutige Tupel zurück, auch wenn das Ergebnis gleich herausstellt.

+4

Das klingt eher nach einem Implementierungsdetail als nach einer Garantie. –

+1

@DietrichEpp das ist wahr genug, und realistisch 'tuple (liste (a))' ist ebenfalls (seit nichts stoppt 'tuple .__ new__', sagen wir, schwache References zu allen Tupeln, die es bereits erstellt hat). Es gibt wahrscheinlich * keine * absolut garantierte Möglichkeit, zwei verschiedene, aber gleiche Tupel zu haben, wenn sie nur unveränderliche Elemente enthalten. – lvc

+1

Interessant. – wim

21

Sie suchen nach deepcopy.

from copy import deepcopy 

tup = (1, 2, 3, 4, 5) 
put = deepcopy(tup) 

Zugegeben, die ID dieser beiden Tupel wird auf die gleiche Adresse zeigen. Da ein Tupel unveränderlich ist, gibt es wirklich keinen Grund, eine weitere Kopie derselben zu erstellen. Beachten Sie jedoch, dass Tupel veränderbare Elemente sie enthalten können, und deep/id verhält sich wie Sie erwarten, es würde:

from copy import deepcopy 
tup = (1, 2, []) 
put = deepcopy(tup) 
tup[2].append('hello') 
print tup # (1, 2, ['hello']) 
print put # (1, 2, []) 
+1

Ids sind die gleichen für den ersten Fall, und anders für den zweiten Fall sind Tupel gut gestaltet! –

0

versuchen Sie dies:

tup = (1,2,3) 
nt = tuple(list(tup)) 

Und ich denke, das Hinzufügen eines leeren Tupel ist viel besser .

+0

Hinzufügen eines leeren Tupel ist viel besser. –

+0

Was meinst du mit "Und ich denke"? – Mike

+0

Und ich denke, das Hinzufügen eines leeren Tupel ist viel besser. –

Verwandte Themen