[Python] saluti e prima domanda sulle list comprhension
Manlio Perillo
manlio_perillo a libero.it
Dom 27 Gen 2008 17:51:59 CET
Java ha scritto:
> Salve a tutti, sono nuovo di questa mailing list e del pythone più in
> generale!
>
> Prima di fare la domanda, preannuncio che mi sono occupato di questa
> cosa per un paio di giorni, e che essendo completamente niubbo con il
> python potrei aver fatto qualche cavolata :-D
>
> Veniamo alla nota dolente, devo fare un progetto per
> l'università(costruire una rete sociale di video di youtube) che
> comporta anche la scrittura di un piccolo crawler. Ho pensato di usare
> python sostanzialmente perché non lo conoscevo, e così approfitto
> dell'esame per imparare un nuovo linguaggio...
>
> Senza entrare troppo nei dettagli, ho fatto un thread che si occupa di
> fare il crawling di una pagina iterando per in base alla profondità di
> crawling. Cioè se questa è 1 "parso" (ARGH!) solo la pagina iniziale, se
> vale 2 parso anche tutti i link in essa e così via...
>
> ecco il codice:
>
> def run ( self ):
> # lista temporanea
> temp = []
> # all'inizio la lista results contine l'url iniziale
> results = [self.start_url]
> #cast della profondita' in intero poiché la leggo da input
> p = int(self.profondita)
> # finche' la profondita' e' maggiore di zero, intero sulla lista
> temp eseguendo il
> # parsing degli url trovati in essa
> while(p > 0):
> print "Thread lanciato con profondita: ", p
> # copio i risultati attuali dentro la lista temp
> # all'inizio conterrà solo un url
> temp = results
> print "ecco la lista TEMP:"
> print temp
> [results.extend(self.parseUrl(video)) for video in temp]
> print "finito ciclo while \n\n\n" # qua non ci arrivo mai :-(
> p-=1
>
> il problema è che in ogni caso non esce mai dalla list comphrension,
> eppure la lista temp contiene un solo url!
> In pratica continua a ciclare come se ogni volta eseguisse temp =
> results, ma non capisco il perché...
>
> qualche idea?
>
temp e results fanno riferimento allo stesso oggetto, e quindi quello
che stai in realtà facendo è qualcosa tipo:
l = [1]
[l.append(i) for i in l]
Nella list comphrension la lista è valutata in modo lazy, quindi hai un
ciclo infinito.
Manlio Perillo
More information about the Python
mailing list