[Python] copy and id() function
Andrea Gasparini
gaspa a yattaweb.it
Mar 13 Ott 2009 11:30:05 CEST
> Dear all,
Ciao, credo che possiamo scrivere in italiano, giusto? ;)
Allora, la cosa che forse non è chiara, è che in python i nomi delle
variabili sono semplici "riferimenti" a un oggetto, non corrispondono
all'oggetto stesso. Esempio semplice che spero possa chiarire:
>>> a = [1,2,3]
>>> b = [1,2,3]
>>> c = b
>>> a is b
False
>>> b is c
True
> - shallow copy: produce a new object that is not linked to
> the native object. Slicing on a list produces a shallow copy of the
> original one.
Quindi quando fai uno slice, quel che realmente fai non è la copia di tutti
gli elementi uno per uno, ma copi _i_riferimenti_ dentro la lista.... gli
oggetti rimangono gli stessi. tornando all'esempio di prima:
>>> a[0] is b[0]
True
> - deep copy: bit-bit copy (in other words we have here a
> reference to the native object (link))
questa non la chiamerei affatto 'deep copy', in quanto quel che fai è
creare un'altro riferimento allo stesso oggetto.
Nel tuo caso: l4 e l2 sono due nomi per la stessa lista, tant'è che se
modifichi una delle due, anche l'altra rispecchierà le modifiche... solito
esempio:
>>> b.append(4)
>>> c
[1, 2, 3, 4]
Quel che fa la funzione id() è ritornarti l'indentificatore all'oggetto
(che quindi non c'entra con il nome con cui la chiami... )
>>> help(id)
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
infatti:
>>> id(b) == id(c)
True
> Therefore, is not clear to us why in list copy the shallow does not
> affect the sub-list object. In other words the shallow copy is not
> 'recursive' within a shollowed copied object.
Esattamente. Lo slice non copia gli oggetti, copia i riferimenti che sono
contenuti nella lista di cui fai slice.
> More in general, we don't understand the behavior of the id() function.
> Doesn't return the object identity (object adress memory)??
Si', ritorna esattamente quello.
> Why the object identity of the three variables in the following example
> is the same?? Does the id() function behave like the C/C++
> adress-operator &??
circa (come dice l'help....), non ne conosco esattamente l'implementazione,
ma direi che puoi pensarlo come un puntatore all'oggetto in questione.
Spero di essere stato d'aiuto.
bye
--
-gaspa-
-----------------------------------------------
-------- https://launchpad.net/~gaspa ---------
------ HomePage: iogaspa.altervista.org -------
-Il lunedi'dell'arrampicatore: www.lunedi.org -
Maggiori informazioni sulla lista
Python