[Python] incremento variabile

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Python] incremento variabile

Messaggioda gila75 » martedì 13 agosto 2019, 19:57

Dopo tantissimo tempo cerco di rimettermi con la programmazione.
Stavo "attaccando" il python per l'ennesima volta...speriamo che sia quella buona.
ho una semplicissima domanda, mi era già stato spiegato, ma non ricordo dove.
mi era stato detto che in Python l'incremento variabile si fa (preferibilmente) con:
a=1
a=+=1

e non a=a+1
ma non capisco, viene comunque creato sempre un nuovo oggetto di nome "a":
Codice: Seleziona tutto
>>> a=1
>>> id (a)
21717336
>>> a+=1
>>> a
2
>>> id(a)
21717312
>>>


metodo non "pythonico"
Codice: Seleziona tutto
>>> id(a)
21717336
>>> a=a+1
>>> a
2
>>> id(a)
21717312
>>>

in ogni caso viene creato un oggetto nuovo con un diverso indirizzo di memoria.
Dove sta l'inghippo che non capisco?
Avatar utente
gila75
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2538
Iscrizione: gennaio 2013
Località: Airuno(Lecco)
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686

Re: [Python] incremento variabile

Messaggioda nuzzopippo » mercoledì 14 agosto 2019, 6:47

Ciao @gila ... sempre domande "particolari" le Tue, roba per utenti ben più ferrati di me che spero intervengano, canicola permettendo.

Intanto, una "correzione" al volo : l'operatore unario canonicamente NON utilizza la notazione "x = += 1", bensì la notazione "x += 1", come da Te ben utilizzato nel codice ma erratamente espresso nel testo, la prima notazione causa un errore di sintassi.

Ora, in attesa di meglio, una risposta più che altro "intuitiva" da parte mia ... così mi verifico un po' con pareri più competenti ;)
Se ricordo bene le "lezioni" del buon @ClaudioF (i suoi non sono semplici post) è un argomento cui ha gentilmente accennato ed in parte trattato più volte, è lunga rintracciare tali interventi ma "serve".

Da quegli interventi e da altre letture mi sono formato questa approssimativa idea : il "particolare" indirizzamento in memoria delle variabili in python ed il "cambio" di indirizzo alla modifica della variabile è legato al fatto che in python "tutto è un oggetto" (anche i valori) e l'assegnazione di un valore ad una variabile non è altro che un collegamento di quel valore ad un nome, cambiando il "valore" cambia di conseguenza l'indirizzo in memoria riferito dato che si parla di un diverso "oggetto".

Lo so che tale "idea" è approssimativa ma si lega bene alla tipizzazione "non obbligata" delle variabili python ed agli scarni concetti da me letti sulla allocazione dinamica della memoria del "C" sottostante ... ovvio, spero in migliori indicazioni

Ciao e buon "rientro" :D

[Edit] ... ho dovuto cercare ma leggi il punto 8.10 di questa pagina e guarda qua:
Codice: Seleziona tutto
>>> a = "banana"
>>> b = "banana"
>>> id(a), id(b)
(140426923608024, 140426923608024)
>>>

L'indirizzo in memoria delle due variabili è lo stesso ;)
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1263
Iscrizione: ottobre 2006

Re: [Python] incremento variabile

Messaggioda gila75 » mercoledì 14 agosto 2019, 9:08

Ciao Nuzzo, che piacere "rivederti".
In effetti sono sempre domande un po' strane, ma io sono fatto cosi', se non ho chiaro mi blocco.
Clsudio_F aveva spiegato, ma dovrei ricercare bene.
Il fatto che :
a=a+1 e a+=1 creino tutti e due due oggetti diversi mi spiazza, non capisco le differenze, ma se non ricordo male ci sono.
Claudio aveva postato il codice disassemblato, ma non lo sapevo interpretare.
Con calma rileggo bene il tuo post, ora sono in giro.
Intanto grazie !!!
Avatar utente
gila75
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2538
Iscrizione: gennaio 2013
Località: Airuno(Lecco)
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686

Re: [Python] incremento variabile

Messaggioda gila75 » giovedì 15 agosto 2019, 9:08

Ecco, trovato:
viewtopic.php?f=33&t=626951

Codice: Seleziona tutto
>>> import dis
>>> def f():
...     a += 1
...
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_CONST               1 (1)
              6 INPLACE_ADD         
              7 STORE_FAST               0 (a)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE       
>>> def f():
...     a = a + 1
...
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_CONST               1 (1)
              6 BINARY_ADD         
              7 STORE_FAST               0 (a)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE       
>>>

ma non so interpretare. Ad ogni modo è solo una curiosità, io adotto la scrittura a+=1
Avatar utente
gila75
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2538
Iscrizione: gennaio 2013
Località: Airuno(Lecco)
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 5 ospiti