[PIPython] Database
Valentino Volonghi aka Dialtone
dialtone
Gio 10 Mar 2005 20:51:14 CET
Andrea Giammarchi wrote:
> hai ragione in tutto e per tutto, tranne sul fatto che non conosco php
> :-)
> Intendevo dire che se in SQLite 2 crei un campo date o integer e poi
> ci schiaffi un longtext non succede niente, lo prende lo salva e
> basta, come non succede niente in php se crei una var
> $pippo = 1;
>
> e poi
>
> $pippo = 'trallero trallalla';
>
>
> come mi sembra non accadi niente se in python scrivi
>
> pippo = 1
>
> e poi ...
>
> pippo = "trallallero trallalla"
>
>
> intendevo dire questo, e pensavo che lui intendesse questo, non che
> non sono tipizzati, mi sono espresso male.
Non conosco php ma posso spiegarti perche` succede in python.
Quando tu fai
pippo = "trallallero trallalla"
stai creando un oggetto stringa "trallallero trallalla" e stai dicendo
che il nome pippo puntera` a quell'oggetto.
Se ad esempio scrivi:
foo = pippo
Stai dicendo che il puntatore di pippo va assegnato anche a foo. E
quindi foo e pippo punteranno allo stesso oggetto.
Quando scrivi:
pippo = 1
Crea l'oggetto 1 e il suo puntatore assegnalo a pippo.
Sara` cambiato foo? (abbiamo fatto foo = pippo)
No, perche` del puntatore assegnato a foo non abbiamo toccato nulla.
Semplicemente abbiamo tolto una referenza dall'oggetto "trallallero
tallalla" perche` ora il nome pippo non puntera` piu` a lui ma
all'oggetto 1.
Andiamo a vedere come si decompone la sequenza:
a = "trallallero trallalla"
b = a
a = 1
In bytecode python:
In [1]: import dis
In [2]: def fun():
...: a = "trallallero trallalla"
...: b = a
...: a = 1
...:
In [3]: dis.dis(fun)
2 0 LOAD_CONST 1 ('trallallero trallalla')
3 STORE_FAST 0 (a)
3 6 LOAD_FAST 0 (a)
9 STORE_FAST 1 (b)
4 12 LOAD_CONST 2 (1)
15 STORE_FAST 0 (a)
18 LOAD_CONST 0 (None)
21 RETURN_VALUE
A questo punto, usando il comodissimo PyPy (l'implementazione
sperimentale di python in python stesso) ti posso mostrare questo
bytecode cosa fa:
def LOAD_CONST(f, constindex):
w_const = f.getconstant_w(constindex)
f.valuestack.push(w_const)
def STORE_FAST(f, varindex):
w_newvalue = f.valuestack.pop()
f.fastlocals_w[varindex] = w_newvalue
def LOAD_FAST(f, varindex):
# access a local variable directly
w_value = f.fastlocals_w[varindex]
if w_value is None:
varname = f.getlocalvarname(varindex)
message = "local variable '%s' referenced before assignment"
% varname
raise OperationError(f.space.w_UnboundLocalError,
f.space.wrap(message))
f.valuestack.push(w_value)
dove f e` la classe 'Implementatore_di_bytecode'.
Come vedi le operazioni che vengono fatte non si preoccupano del valore
prima contenuto in un nome (varindex) ma lo sovrascrivono senza pensarci:
f.fastlocals_w[varindex] = w_newvalue
Ovviamente essendo il nome di variabile un semplice index in un
dizionario (ed e` davvero cosi` anche in CPython) e` assurdo assegnargli
un tipo. E` come dire che il tuo nome e` di tipo persona. Ma se poi lo
dai a un cane? a un gatto? Che succede? Nulla, e` legale, un nome e` un
nome.
Purtroppo nelle scuole e nei corsi di formazione, si e` insegnato per
anni che una variabile era una scatola che poteva contenere solo alcuni
oggetti. La verita` e` ben diversa. La variabile e` una etichetta con
sopra scritto un nome, e come tutte le etichette la puoi spostare dove
vuoi e dove preferisci senza preoccuparti a cosa la appiccichi,
l'importante e` che si appiccichi.
E ora, tutti ad aiutare lo sviluppo di PyPy :).
--
Valentino Volonghi aka Dialtone
Now Running MacOSX 10.3.8
Blog: http://vvolonghi.blogspot.com
http://weever.berlios.de
More information about the Python
mailing list