[Python] Operatore Is: funzionamento

Manlio Perillo manlio_perillo a libero.it
Sab 27 Giu 2009 17:27:56 CEST


Francesco Ciracì ha scritto:
> [...]
> Is *dovrebbe*, a quanto ne so, essere un operatore di identità.
> Cioè restituire True se i due operandi sono la stessa variabile, non se 
> hanno solo stesso valore.

Esatto.
Ma io sostituirei "variabile" con "oggetto".

> Cioè:
>  >>> a is b
> Dovrebbe essere equivalente a:
>  >>> id(a) == id(b)
> 
> Però:
>  >>> a = 5
>  >>> b = 5
>  >>> id(a)
> 505300184
>  >>> id(b)
> 505300184
>  >>> id(5)
> 505300184

La risposta è semplice: `a` e `b` rappresentano lo stesso oggetto.
Questa è la conseguenza di una ottimizzazione di CPython (la
implementazione ufficiale di Python): gli interi "piccoli" sono
conservati in cache, in modo da evitare allocazioni aggiuntive.

Contro esempio:

>>> a = 9999
>>> b = 9999
>>> a is b
False

>>> a = 10
>>> b = 10
>>> a is b
True


> Che non è affatto il comportamento che si aspetterebbe: per quanto ne so 
> io, due variabili diverse non dovrebbero avere lo stesso indirizzo, 
> condiviso anche con un literal poi!
> 

Non hai chiaro come funzionano le "variabili" in Python.
http://docs.python.org/reference/executionmodel.html#naming-and-binding

Le variabili sono semplici referenze ad oggetti; sono delle "etichette"
che permettono di riferirsi ad un dato oggetto.

> E addirittura:
>  >>> x = 8
>  >>> y = 12
>  >>> id(x)
> 505300232
>  >>> id(y)
> 505300296
>  >>> y=8
>  >>> id(y)
> 505300232
> 

Cosa ha di diverso questo esempio rispetto al primo che hai fatto?

> [...]


Ciao  Manlio


Maggiori informazioni sulla lista Python