2013-03-05 16 views
11

copy.copy() e copy.deepcopy() copia il riferimento per un oggetto immutabile come una tupla. Come posso creare una copia duplicata del primo oggetto immutabile in una posizione di memoria diversa?Come posso copiare un oggetto immutabile come tupla in Python?

+4

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

+12

perché è necessario copiarlo comunque, se è immutabile allora sei sicuro che un riferimento non è abbastanza buono? – wim

+1

@wim Vero. Mi aspettavo che qualcuno lo chiedesse. Ma c'è ancora un modo? –

risposta

16

Aggiungere la tupla vuota:

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

Concatenazione tuple restituisce sempre una nuova tupla distinto, anche quando il risultato risulta essere uguale.

+4

Questo suona come un dettaglio di implementazione piuttosto che una garanzia. –

+1

@DietrichEpp che è abbastanza vero, e realisticamente 'tuple (list (a))' è allo stesso modo (poiché nulla interrompe 'tuple .__ new__', ad esempio, mantenendo deboli rimandi a tutte le tuple che ha già creato). Esiste probabilmente * no * modo assoluto di avere due tuple distinte ma uguali se contengono solo elementi immutabili. – lvc

+1

Interessante. – wim

21

Stai cercando deepcopy.

from copy import deepcopy 

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

Certamente, l'ID di queste due tuple punterà allo stesso indirizzo. Dato che una tupla è immutabile, non c'è davvero alcun motivo per crearne un'altra copia esattamente uguale. Si noti tuttavia che le tuple possono contenere elementi mutevoli a loro, e deepcopy/id si comporta come si prevede che sarebbe:

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

Gli ID sono gli stessi per il primo caso, e diversi per il secondo caso, le tuple sono ben progettate! –

0

provare questo:

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

E penso di aggiungere una tupla vuota è molto meglio .

+0

aggiungere una tupla vuota è molto meglio. –

+0

Cosa intendi con "E penso"? – Mike

+0

E penso che aggiungere una tupla vuota sia molto meglio. –

Problemi correlati