Ich bekomm eine forwhile Schleife nicht gebändigt. Hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Thuught
User
Beiträge: 28
Registriert: Mittwoch 3. Dezember 2008, 12:19

Freitag 12. Dezember 2008, 12:41

Hallo Python Comm,
Könnte ihr mir eine kleine Hilfestellung gehen, warum mein Code
nicht funktioniert? Er sollte mir eigtl eine Liste aus Teillisten produzieren.
Stattdessen sind die alle leer.

Code: Alles auswählen

z=[1,2]
b=[]

def test(x): 
	q=len(x)
	for p in range(q):
		test=True
		b.append(x)
		x.append("+1")
		while (dLauf<2 and test) or (dLauf==2 and len(x)!=0):
			test=False
			b.append(x)
			del x[0]
		if len(x)==0: break

>>> for dLauf in range(3):
...            test(z)
>>> b
[[], [], [], [], [], [], [], [], [], [], [], []]
edit: ums mal auf den Punkt zu bringen:

Code: Alles auswählen

>>> def test(x):
          for i in range(3):
... 	        b.append(x)
macht ähnliche Dinge
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Freitag 12. Dezember 2008, 12:51

Aua, also der Code tut an vielen Ecken weh.

1. Man kann ohne range() über die Elemente einer Liste iterieren. Somit braucht man in der Regel nicht die Länge der Liste ermitteln.
2. Du hantierst wild mit den Variablen und ihren eigentlichen Namensbereichen.
dLauf wird ausserhalb von test() definiert und innerhalb verwendet. Das geht mal garnicht! ;) Genau so der Zugriff auf b.

Vielleicht zeigst du mal was dein Ergebnis sein sollte. Ich werde aus dem Snippet absolut nicht schlau was da sinnvolles bei rauskommen müßte.
Thuught
User
Beiträge: 28
Registriert: Mittwoch 3. Dezember 2008, 12:19

Freitag 12. Dezember 2008, 13:07

Ich hatte eigtl nicht vor, mein richtige Funktion zu zeigen, weil das bei euch bestimmt Augenkrebs verursacht. Aber du hast es ja gewünscht :D

Code: Alles auswählen

def crawl(query): 
	q=len(query)
	for p in range(q):
		test=True
		while (dLauf<2 and test) or (dLauf==2 and len(query)!=2): 
		foundlinks=aref.findall(urllib2.urlopen(query[0].adr).read())
			query[0].verlinkt=map(makelink,foundlinks)
			while (query[0].verlinkt).count(None)!=0:
				(query[0].verlinkt).remove(None)
			for i in query[0].verlinkt:
				query.append(i)
				(link.allinst).append(i)
			del query[0]
                        test=False
		if len(query)==0: break

		
es geht um einen Webcrawler, der in der queryliste alle Links einträgt, die er gefunden hat- aber solang dLauf, also die Tiefe noch nicht erreicht ist
immer die Funde des vorherigen durchlaufs abarbeit und erst am Ende die Liste leert.
makelink macht kurz gesagt ne linkinstanz aus nem link.
link.verlinkt ist ne Liste auf Linkinstanzen die die entsprechende Instanz
verlinkt. link.allinst ist ne Klassenvariabel, damit ich später auf die instanzen zugreifen kann

Mein Problem ist, dass query[0].verlinkt immer leer ist, genauso wie die Liste b oben
Zuletzt geändert von Thuught am Freitag 12. Dezember 2008, 13:12, insgesamt 1-mal geändert.
DeJe
User
Beiträge: 39
Registriert: Sonntag 23. November 2008, 19:38

Freitag 12. Dezember 2008, 13:11

Du packst immer nur die Referenz von x in b. Und x ist nun mal am Ende leer. :D

versuche mal b.append(x[:]). ;)
Zuletzt geändert von DeJe am Freitag 12. Dezember 2008, 13:12, insgesamt 1-mal geändert.
BlackJack

Freitag 12. Dezember 2008, 13:12

@Thuught: Ausserdem braucht man sich den Quelltext gar nicht näher anschauen, denn das ist sicherlich nicht der, um den es geht. Das was da steht ist überhaupt nicht lauffähig, weil es eine Mischung aus Quelltext in einem Modul und interaktivem Interpreter ist. Das gibt, bevor es läuft, schon einen `SyntaxError`.

Ansonsten möchte ich mich Zap anschliessen. Werte betreten Funktionen als Argumente und verlassen sie als Rückgabewerte. Aus einer Funktion heraus irgendwelche Objekte auf Modulebene zu verändern ist Murks.

Leer sind die Listen wahrscheinlich deshalb, weil Du immer wieder `x` hinzufügst, aber aus `x` auch alle Elemente löschst.

Code: Alles auswählen

In [243]: x = [1, 2, 3]

In [244]: b = list()

In [245]: b.append(x)

In [246]: b.append(x)

In [247]: b
Out[247]: [[1, 2, 3], [1, 2, 3]]

In [248]: del x[0]

In [249]: b
Out[249]: [[2, 3], [2, 3]]

In [250]: b[0] is x
Out[250]: True
Edit: Nachdem ich jetzt die echte Funktion gesehen habe: Schmeiss das bitte alles weg und schreibe es ordentlich und sauber neu. Da steigt doch kein Mensch durch, globale Variablen sind schlecht, und ich glaube auch nicht, das *der* Code jemals das tut was Du im Text beschreibst.
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Freitag 12. Dezember 2008, 16:24

Hi,
ich will dich nicht ärgern oder ähnliches ;)
aber hast du dir das Tutorial mal angesehen( http://python.net/~gherman/publications ... nline/tut/) ?
Zu deinem ersten Code ist mir nur aufgefallen:
solange du `test()` nicht auch b übgergibst wird das nix. Also
da müsste schon mindestens noch sowas sein wie:

Code: Alles auswählen

def test(x, liste):
    ## tu was...
    liste.append(irgendwas)
    ## tu noch mehr...
MfG Jonas :)
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Freitag 12. Dezember 2008, 17:18

@jonas Du hast da nicht wirklich gerade ein 9! Jahre altes Tutorial verlinkt?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 12. Dezember 2008, 17:59

DasIch hat geschrieben:@jonas Du hast da nicht wirklich gerade ein 9! Jahre altes Tutorial verlinkt?

> 9 1/2 ! :D

Aber soweit ich sehe, ist das die letzte deutsche Übersetzung des offiziellen Tutorials (würde mich freuen, wenn ich Unrecht hätte ...).
Wobei man mal wieder sehen kann, wie wichtig es ist, Englisch zu lernen, wenn man es beim Programmieren zu was bringen will ... :wink:
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 12. Dezember 2008, 19:27

Naja, es gibt schon auch aktuellere deutsche Tutorials. (Aber englischlernen rentiert sich sowieso)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 12. Dezember 2008, 20:13

Leonidas hat geschrieben:Naja, es gibt schon auch aktuellere deutsche Tutorials.
Jo, stimmt. Zumindest als PDF gibt es eine deutsche Übersetzung des Originals, die nur gut 7 1/2 Jahre alt ist (zu Python 2.1): http://starship.python.net/crew/gherman ... -de-21.pdf
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Freitag 12. Dezember 2008, 20:44

Hi :D,
Trotz des Alters stehen da wichtige Anfangssachen drin.
MfG Jonas
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Freitag 12. Dezember 2008, 21:02

jonas hat geschrieben:Trotz des Alters stehen da wichtige Anfangssachen drin.
Nur kann ein Anfänger diese nicht vom Rest trennen.
Antworten