2010-11-20 7 views
0

Je crée une sorte de base de données, en utilisant une liste qui est lue depuis l'utilisateur. Lorsque l'utilisateur entre finish, je veux que la boucle while s'arrête. Cependant, pour une raison quelconque, je dois entrer finish DEUX FOIS pour qu'il casse la boucle.La boucle ne se casse pas

De plus, la liste est vide après avoir été renvoyée.

def readNames(): 
nameList = [] 
count = 0 
while count != -1: #infinite loop 
    addList = raw_input("Please enter a name: ") 
    if addList == 'finish': 
     return nameList 
     break 
    nameList.append(addList) 
    print nameList 

Je l'invoque et de vérifier si elle a travaillé avec

readNames() 
print readNames() 

De plus, voici la sortie

Please enter a name: Dave 
['Dave'] 
Please enter a name: Gavin 
['Dave', 'Gavin'] 
Please enter a name: Paul 
['Dave', 'Gavin', 'Paul'] 
Please enter a name: Test1 
['Dave', 'Gavin', 'Paul', 'Test1'] 
Please enter a name: finish 
Please enter a name: finish 
[] 
>>> 
+0

Fonctionne bien pour moi (in IDLE). En dehors de cela, il existe des moyens beaucoup plus faciles de faire une boucle infinie ('alors que True:' est suffisant, pourquoi créer une variable fictive + condition? Je cherchais en fait le 'count = -1' ...). De plus, le 'break 'n'est pas nécessaire (' return' quitte la fonction et donc la boucle). – delnan

+0

Fonctionne bien pour moi, quelques notes cependant: Vous pouvez simplement faire 'while True:' pour votre boucle infinie, vous n'avez pas non plus besoin de 'break' après votre retour car le' break' ne sera jamais atteint. 'names = readNames()' fonctionne très bien pour moi. PS: J'ai réparé votre indentation. –

Répondre

4

Lorsque vous faites

readNames() 
print readNames() 

vous exécutez la fonction deux fois. Sur la deuxième course, vous entrez simplement "terminer" et c'est pourquoi votre liste reste vide.

Ce que vous voulez faire est la suivante:

def readNames(): 
    nameList = [] 
    while True: #infinite loop 
     addList = raw_input("Please enter a name: ") 
     if addList == 'finish': 
      return nameList 
     nameList.append(addList) 

# store the result, then print it 
names = readNames() 
print names 
+0

Merci pour l'aide massive. Été bloqué sur cela pendant des siècles. :) – Hypergiant

-1

Pouvez-vous pas remplacer

 
if addList == 'finish': 
     return nameList 
     break 

Avec

 
if addList == 'finish': 
     return nameList 
     count = -1 

?

James

+1

-1 Non seulement cela est encore superflu (voir les commentaires par moi et Ivo), il ne répond pas non plus à la question. – delnan

+0

La même chose se passe. – Hypergiant

+0

Juste ajouter mes deux cents. Désolé les gens. – Bojangles

2

Je pense que votre code d'appel est accidentellement readnames() deux fois invoque.

+0

Oui, il semble que c'est ce qui se passe. Après avoir enlevé 'print readNames()', il se casse comme prévu. – Hypergiant

1

Ah, après avoir publié votre code, je peux voir la question:

readNames() 
print readNames() 

Vous appelez readNames, lisez les noms de stdin comme prévu, correctement return les noms de lecture et ensuite jeter le résultat parce que vous ne l'attribuez à rien (names = readNames()). Ensuite, vous appelez readNamesà nouveau, et il vous apparaît comme si il n'a pas quitté la boucle (il l'a fait, mais vous lui avez dit de boucler à nouveau). Vous tapez à nouveau finish et la deuxième invocation de readNames se termine sans aucun nom entré (nameList est une variable locale, il est donc perdu après l'exécution de la fonction), de sorte que vous obtenez [].

Pour résoudre ce problème, (1) rafraîchissez vos connaissances générales en programmation;) et (2) faites quelque chose comme names = readNames(); print names.

+0

Un grand merci pour l'aide, malheureusement THC4k vous a battu. :) – Hypergiant

Questions connexes