Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini è uno smartwatch compatto capace di offrire un'esperienza completa di monitoraggio della salute e fitness con una cassa da 43 mm che può adattarsi a qualsiasi tipo di polso, dal più grande al - soprattutto - più piccolo. Con l'architettura dual-chip e un'autonomia che può coprire due giorni con tranquillità, rappresenta la soluzione ideale per chi cerca prestazioni premium in un formato ridotto.
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Dopo il recente lancio della serie Xiaomi 15T di Monaco, vi parliamo oggi della versione più performante della nuova famiglia, ovvero Xiaomi 15 T Pro. Vi raccontiamo la nostra prova nel dettaglio, spiegando perché a questo prezzo e in questa fascia, questo smartphone ha davvero senso tenerlo in seria considerazione.
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer ha ampliato la sua offerta professionale con il TravelMate P6 14 AI, un notebook ultraleggero e robusto pensato per chi lavora in mobilità. Certificato Copilot+ PC, combina design premium, autonomia elevata e piattaforma Intel Core Ultra Serie 2 con funzionalità AI, garantendo sicurezza, affidabilità e produttività per l'utenza business moderna.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-12-2009, 13:21   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6114
[Python] Oggetti mutable di default

Ciao a tutti, sto imparando il Python seguendo questa guida, ho appena iniziato:

http://www.python.it/doc/Howtothink/...l-it/index.htm

In più, sto seguendo questo link:

http://zephyrfalcon.org/labs/python_pitfalls.html

Nell' esempio 5, viene mostrato cosa succede in questo caso:

Codice:
def popo(x=[]):
...     x.append(666)
...     print x
...     
>>> popo([1, 2, 3])
[1, 2, 3, 666]
>>> x = [1, 2]
>>> popo(x)
[1, 2, 666]
>>> x
[1, 2, 666]
E l'output mi torna.

Ma come mai se scrivo questo:

Codice:
def prova(x=1):
    x = x +1
    print x
x non viene incrementato ad ogni chiamata di prova senza argomenti? Cioè, mi aspetterei, alla luce dell' esempio sopra, che chiamando due volte prova() x valga 3, ma invece vale sempre 2.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 13:40   #2
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Se definisci una funzione in modo che si aspetti un argomento e poi la chiami senza parametri lasciando l'argomento predefinito, è normale che non può fare quello che vorresti. Ogni volta che entri nella funzione la situazione delle variabili all'interno si "resetta". Di conseguenza è normale che ottieni sempre due: Python valuta l'espressione a destra (vede l'uno che assegna ad x e gli aggiunge x che in quel momento è 1) e quindi ottieni x = 2.
Inoltre non capisco perchè passi i parametri come keyword. E' bruttissimo quel codice.

Ultima modifica di Ryuzaki_Eru : 28-12-2009 alle 14:03.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 13:49   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6114
Quote:
Originariamente inviato da Ryuzaki_Eru Guarda i messaggi
Se definisci una funzione in modo che si aspetti un argomento e poi la chiami senza parametri è normale che non può fare quello che vorresti. Ogni volta che entri nella funzione la situazione delle variabili all'interno si "resetta". Di conseguenza è normale che ottieni sempre due: Python valuta l'espressione a destra (vede l'uno che assegna ad x e gli aggiunge x che in quel momento è 1) e quindi ottieni x = 2.
Si ok, ma leggendo nel link che ho postato e seguendo l'esempio all'inizio dice:

Codice:
The default argument is bound *once*, when the function is *created*, not when it's called
In questo caso l'argomento di default è x e, a leggere qua, dovrebbe essere creato una volta sola.

Quote:
Originariamente inviato da Ryuzaki_Eru Guarda i messaggi
Inoltre non capisco perchè passi i parametri come keyword. E' bruttissimo quel codice.
Non ho capito..

Ultima modifica di Unrue : 28-12-2009 alle 13:55.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 13:59   #4
nico159
Senior Member
 
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Si ok, ma leggendo nel link che ho postato e seguendo l'esempio all'inizio dice:

Codice:
The default argument is bound *once*, when the function is *created*, not when it's called
In questo caso l'argomento di default è x e, a leggere qua, dovrebbe essere creato una volta sola.



Non ho capito..
Perchè i numeri sono oggetti immutabili in Python
__________________
In a world without fences, who needs Gates?
Power by: Fedora 8 - Mac OS X 10.4.11
nico159 è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 13:59   #5
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ciao a tutti, sto imparando il Python seguendo questa guida, ho appena iniziato:

http://www.python.it/doc/Howtothink/...l-it/index.htm

In più, sto seguendo questo link:

http://zephyrfalcon.org/labs/python_pitfalls.html

Nell' esempio 5, viene mostrato cosa succede in questo caso:

Codice:
def popo(x=[]):
...     x.append(666)
...     print x
...     
>>> popo([1, 2, 3])
[1, 2, 3, 666]
>>> x = [1, 2]
>>> popo(x)
[1, 2, 666]
>>> x
[1, 2, 666]
E l'output mi torna.

Ma come mai se scrivo questo:

Codice:
def prova(x=1):
    x = x +1
    print x
x non viene incrementato ad ogni chiamata di prova senza argomenti? Cioè, mi aspetterei, alla luce dell' esempio sopra, che chiamando due volte prova() x valga 3, ma invece vale sempre 2.
Questo succede perché le liste sono oggetti "mutabili", per cui in qualunque punto del codice vengono modificati, tali modifiche si rifletteranno in tutte le variabili che contengono dei loro riferimenti.

Ecco perché l'output "ti torna" con l'esempio delle liste.

Ciò ovviamente non avviene con gli oggetti che sono immutabili, come gli interi, le stringhe, ecc.

Ed ecco perché non ti torna il secondo esempio. Questo perché il parametro x della funzione prova riceve ad ogni chiamata un valore nuovo, che viene incrementato, stampato, ma poi distrutto alla fine della chiamata.

Attenzione che, per quanto detto, possono esserci problemi quando si definisco funzioni aventi parametri predefiniti con assegnati oggetti mutabili, perché tale valore viene calcolato una sola volta, alla definizione della funzione, per poi essere riutilizzato in tutti gli altri casi (si può pensare come a una sorta di variabile statica in linguaggi come C & co). Esempio:
Codice:
def popo2(x=[]):
  x.append(666)
  return x

print popo2()
print popo2([1, 2])
print popo2()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 14:16   #6
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Quote:
In questo caso l'argomento di default è x e, a leggere qua, dovrebbe essere creato una volta sola.
Infatti viene creato un volta sola, ma come ti è stato detto gli interi sono tipi immutabili. Quando tu crei la funzione con parametro x = 1 hai referenziato alla variabile x (che esiste solo nello scope della funzione) l'oggetto 1. Questo non cambierà mai. Ogni volta che chiami prova() è come se la chiamassi con prova(1) e di conseguenza otterrai sempre 2.
Se invece nel tuo primo esempio con le liste provi a chiamare la funzione senza parametri vedrai che otterrai il medesimo risultato del codice scritto da cdimauro.
Esempio:

Codice:
>>> a = 1
>>> b = a
>>> a += 1
>>> a
2
>>> b
1
>>> a = [1,2]
>>> b = a
>>> a[0] = "ciao"
>>> a
['ciao', 2]
>>> b
['ciao', 2]
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 14:54   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6114
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Codice:
def popo2(x=[]):
  x.append(666)
  return x

print popo2()
print popo2([1, 2])
print popo2()
Perfetto, adesso ho capito! Grazie mille a tutti

Però ad esempio, se faccio un ciclo di 100 iterazioni, in cui incremento di 1 una variabile intera ad ogni iterazione, vengono creati e distrutti continuamente 100 oggetti interi?

Ultima modifica di Unrue : 28-12-2009 alle 15:01.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 16:18   #8
nico159
Senior Member
 
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
CPython ha già pronti in memoria un pò di int
Se non ricordo male, da -5 a 256
__________________
In a world without fences, who needs Gates?
Power by: Fedora 8 - Mac OS X 10.4.11
nico159 è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 18:44   #9
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6114
Quote:
Originariamente inviato da nico159 Guarda i messaggi
CPython ha già pronti in memoria un pò di int
Se non ricordo male, da -5 a 256
Come mai hanno implementato questo comportamento con gli incrementi su oggetti non mutable?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2009, 19:11   #10
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Non mutabile non significa che non ci puoi fare nulla. Semplicemente Python crea un nuovo oggetto invece di modificarne uno esistente.
Il motivo per il quale ha un pò di interi "messi da parte" è dovuto al suo meccanismo di "chace" interno. che tiene "da parte" i valori più piccoli per poterli prendere più velocemente in caso di necessità.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 29-12-2009, 14:36   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6114
Ehm,
ho un altro piccolo quesito. Se scrivo:

Codice:
a = 3

def prova(x):
   x+=1

prova(a)
Giustamente, a non cambia di valore.

Ma allora, perché se scrivo così:

Codice:
lista = [10]

def prova(elem):
    elem[0]+=1

prova(lista)
Perché così invece il primo valore di lista viene incrementato? Il tipo dell'elemento lista[0] è sempre un intero, quindi dovrebbe comportarsi come l'esempio precedente. Oppure conta solo il tipo del contenitore, quindi tipo lista e quindi mutable?

Ultima modifica di Unrue : 29-12-2009 alle 14:38.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 29-12-2009, 14:44   #12
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6114
Ehm,
ho un altro piccolo quesito. Se scrivo:

Codice:
a = 3

def prova(x)
   x+=1

prova(a)
Giustamente, a non cambia di valore.

Ma allora, perché se scrivo così:

Codice:
lista = [10]

def prova(elem):
    elem[0]+=1

prova(lista)
Perchè così invece il primo valore di lista viene incrementato? Il tipo dell'elemento elem[0] è sempre un intero, quindi dovrebbe comportarsi come l'esempio precedente. Oppure conta solo il tipo del contenitore, quindi lista e quindi mutable?

Scusate l'edit doppio..

Ultima modifica di Unrue : 29-12-2009 alle 14:57.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 29-12-2009, 15:56   #13
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Come ti è stato detto le liste sono mutabili. Se passi una lista alla funzione viene modificato direttamente l'oggetto. Se passi un intero viene creato un *nuovo* oggetto che all'uscita della funzione viene distrutto, di conseguenza la variabile a rimane intatta.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 30-12-2009, 07:28   #14
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da nico159 Guarda i messaggi
CPython ha già pronti in memoria un pò di int
Se non ricordo male, da -5 a 256
Sì, esatto. E tiene in memoria anche:
- la stringa vuota;
- tutte le stringhe dotate di un solo carattere;
- tutte le stringhe unicode dotate di un solo carattere con codice fino U00FF (i primi 256 elementi);
- la tupla vuota;
- gli oggetti None, True, False ed Ellipsis (...).

Il tutto, come diceva giustamente Ryu, per fare caching.

Tra poco avrà in memoria anche le stringhe '__enter__' ed '__exit__', ma non nella versione ufficiale.
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ehm,
ho un altro piccolo quesito. Se scrivo:

Codice:
a = 3

def prova(x)
   x+=1

prova(a)
Giustamente, a non cambia di valore.

Ma allora, perché se scrivo così:

Codice:
lista = [10]

def prova(elem):
    elem[0]+=1

prova(lista)
Perchè così invece il primo valore di lista viene incrementato? Il tipo dell'elemento elem[0] è sempre un intero, quindi dovrebbe comportarsi come l'esempio precedente. Oppure conta solo il tipo del contenitore, quindi lista e quindi mutable?

Scusate l'edit doppio..
Come diceva Ryu, stai referenziando un elemnto della lista che hai passato alla funzione. Più precisamente, le azioni che Python compie con questo:
Codice:
elem[0] += 1
pezzo di codice sono effettivamente le seguenti:
Codice:
prova[0] = prova[0] + 1
Perché il parametro lista punta esattamente all'oggetto prova, che è una lista. E tu stai dicendo a Python di prendere il contenuto dell'elemento che sta nella posizione 0, sommargli 1, e mettere il risultato alla medesima posizione.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla OPPO Watch X2 Mini, lo smartwatch compatto a cui...
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione Xiaomi 15T Pro, è lui il nuovo best buy? ...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Caos nell'impero Musk: perché i m...
Microsoft Sentinel si evolve e diventa u...
La navicella spaziale Orion per le missi...
Gmail, gli utenti aziendali possono invi...
Il Moige contro Meta e TikTok: via a un'...
La NASA potrebbe impiegare dei lander lu...
Bezos: l'intelligenza artificiale vive u...
Allarme sicurezza: TikTok suggerisce con...
Apple non potrà più pubbli...
Prime Day fa volare MOVA: super sconti f...
Hoover HMC5 è l'alleato perfetto contro ...
LG porta webOS 25 sui TV degli anni pass...
ECOVACS DEEBOT T50 OMNI in offerta a 399...
TIM Enterprise investirà 1 miliar...
Google Pixel 10, prezzo bomba di 649€ su...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:52.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v