n° 219
Novembre 2017
Dicembre 11, 2017, 06:47:46 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Python e l'operazione logica IS  (Letto 4331 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
claudiob
Newbie
*

Karma: +1/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« inserita:: Marzo 17, 2015, 02:46:51 »

Ho letto che in Python più che parlare di variabili sarebbe corretto parlare di oggetti e di riferimenti a essi e in tal senso l'operatore IS dovrebbe dare una buona idea di questa cosa.

Se ad esempio creo due liste

Codice:
a = ['a', 'b']
b = ['a', 'b']

l'operatore IS restituirà FALSE con
Codice:
a is b

E non cambia anche nel caso utilizzi due stringhe apparentemente identiche

Codice:
a = 'Hello World'
b = 'Hello World'

a is b
darà FALSE

Non capisco però per qual motivo quando faccio

Codice:
a = 'Hello'
b = 'Hello'

a is b
da TRUE

Per ora l'unica discriminante che vedo è che in "Hello World" c'è lo SPAZIO e nel semplice "Hello" no. Vorrei sapere cosa c'è dietro questo risultato differente  Sorriso
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #1 inserita:: Marzo 17, 2015, 03:29:05 »

Ottima domanda!

Guarda qui:
http://stackoverflow.com/questions/1504717/why-does-comparing-strings-in-python-using-either-or-is-sometimes-produce

in particolare la seconda risposta:
"The reason this works interactively is that (most) string literals are interned by default. From Wikipedia:"
[...]
"So, when you have two string literals (words that are literally typed into your program source code, surrounded by quotation marks) in your program that have the same value, the Python compiler will automatically intern the strings, making them both stored at the same memory location. (Note that this doesn't always happen, and the rules for when this happens are quite convoluted, so please don't rely on this behavior in production code!)"

In pratica python ottimizza l'occupazione di memoria per cui *in certi casi* le due variabili che contengono la stringa puntano alla stessa area di memoria (per cui il test con IS risulta VERO).




Registrato

claudiob
Newbie
*

Karma: +1/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« Risposta #2 inserita:: Marzo 17, 2015, 05:00:57 »

Ti ringrazio per la risposta paooolino.  Sorriso
Resta comunque il fatto che mi piacerebbe scoprire quale meccanismo c'è dietro a un livello più basso. Diciamo che con questo comportamento un po' "ambiguo", se mi passi il termine, ho il timore di poter commettere in futuro qualche errore semmai dovessi trovare un utilizzo pratico.
Posso semplificare asserendo che magari è più utile quando si utilizza con oggetti costruiti ad hoc e non con queste variabili inserite automaticamente in oggetti da Python stesso.
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #3 inserita:: Marzo 17, 2015, 05:22:13 »

il meccanismo al livello più basso è esattamente quello descritto: literals interning.

sono ottimizzazioni che l'interprete python fa per conto proprio.

di sicuro non puoi incappare in errori se utilizzi uno stile di programmazione consono: il che significa, non utilizzare l'operatore IS per confrontare due stringhe!

che poi puntino allo stesso oggetto o no, a te non dovrebbe interessare.

python si smazza il tutto perchè il suo comportamento sia consistente.

se scrivi

a = "Hello"
b = "Hello"

Python assegna sia a che b alla stessa area di memoria

ma se tu dopo modifichi a

a = "bb"

b rimane "Hello" perchè Python le disaccoppia (come tu ti aspetteresti).

a te basta sapere che questo meccanismo esiste - e se per caso incappi in qualcosa di apparentemente inspiegabile ti basta ricordare che questo potrebbe essere un motivo.

errori poi programmando se ne fanno in continuazione, con l'esperienza si impara a riconoscerli e a risolverli sempre più velocemente.

poi quando capita qualcosa di inspiegabile si approfondisce, come ho fatto io quando ho ricercato poco fa la spiegazione alla tua domanda (che non conoscevo).

Se vuoi poi qui c'è una spiegazione del perchè si usa l'interning per ottimizzare l'occupazione di memoria

http://blog.jetbrains.com/dotnet/2015/02/12/string-interning-effective-memory-management-with-dotmemory/

Registrato

claudiob
Newbie
*

Karma: +1/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« Risposta #4 inserita:: Marzo 17, 2015, 05:31:00 »

sono contento che abbiamo imparato qualcosa entrambi  Sorriso
... e sì, il fatto di ricordare questa cosa potrebbe effettivamente tornare utile proprio perchè a volte crediamo di andare sul sicuro e in realtà non conosciamo a fondo una determinata funzione o un determinato operatore. Di sicuro porrò cautela nell'utilizzarlo con le semplici stringhe  Ghigno
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines