|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
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] Ma come mai se scrivo questo: Codice:
def prova(x=1): x = x +1 print x ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
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. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6114
|
Quote:
Codice:
The default argument is bound *once*, when the function is *created*, not when it's called Non ho capito.. Ultima modifica di Unrue : 28-12-2009 alle 13:55. |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Quote:
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Quote:
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] |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6114
|
Quote:
![]() 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. |
|
![]() |
![]() |
![]() |
#8 |
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 |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6114
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
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à. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6114
|
Ehm,
ho un altro piccolo quesito. Se scrivo: Codice:
a = 3 def prova(x): x+=1 prova(a) Ma allora, perché se scrivo così: Codice:
lista = [10] def prova(elem): elem[0]+=1 prova(lista) Ultima modifica di Unrue : 29-12-2009 alle 14:38. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6114
|
Ehm,
ho un altro piccolo quesito. Se scrivo: Codice:
a = 3 def prova(x) x+=1 prova(a) Ma allora, perché se scrivo così: Codice:
lista = [10] def prova(elem): elem[0]+=1 prova(lista) Scusate l'edit doppio.. Ultima modifica di Unrue : 29-12-2009 alle 14:57. |
![]() |
![]() |
![]() |
#13 |
Senior Member
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.
|
![]() |
![]() |
![]() |
#14 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
- 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:
Codice:
elem[0] += 1 Codice:
prova[0] = prova[0] + 1
__________________
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 |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:52.