2012-01-03 27 views
9

Attualmente sto imparando Python da un libro chiamato "Python per il principiante assoluto (terza edizione)". C'è un esercizio nel libro che delinea il codice per un gioco dell'impiccato. Ho seguito questo codice, ma continuo a restituire un errore nel bel mezzo del programma.Errore Python: "IndexError: indice stringa fuori intervallo"

Ecco il codice che causa il problema:

if guess in word: 
    print("\nYes!", guess, "is in the word!") 

    # Create a new variable (so_far) to contain the guess 
    new = "" 
    i = 0 
    for i in range(len(word)): 
     if guess == word[i]: 
      new += guess 
     else: 
      new += so_far[i] 
     so_far = new 

Questo è anche l'errore viene restituito:

new += so_far[i] 
IndexError: string index out of range 

qualcuno potrebbe aiutarmi con che cosa sta andando male e quello che posso fare per aggiustarlo?

edit: ho inizializzato la variabile so_far in questo modo:

so_far = "-" * len(word) 
+2

Questo è minore e non correlato alla domanda, ma non è necessario l'i = 0. Il ciclo for imposta automaticamente la variabile di ciclo quando viene avviata anche se non è stata ancora definita. –

+0

@ Chad Sì, è giusto. Non riesco a ricordare perché l'ho bloccato in: S – Darkphenom

risposta

11

Sembra che tu abbia indentato so_far = new troppo. Prova questo:

if guess in word: 
    print("\nYes!", guess, "is in the word!") 

    # Create a new variable (so_far) to contain the guess 
    new = "" 
    i = 0 
    for i in range(len(word)): 
     if guess == word[i]: 
      new += guess 
     else: 
      new += so_far[i] 
    so_far = new # unindented this 
+4

+1 bonus occhio d'aquila. – hochl

+0

Sì, grazie mille! Trovo un po 'di confusione avere solo rientranze per cose che sarei abituato a mettere in parentesi graffe! – Darkphenom

5

Si effettua l'iterazione una stringa (word), ma poi con l'indice in quella di cercare un personaggio in so_far. Non vi è alcuna garanzia che queste due stringhe abbiano la stessa lunghezza.

1

Questo errore si verifica quando il numero di tentativi (so_far) è inferiore alla lunghezza della parola. Ti sei perso un'inizializzazione per la variabile so_far da qualche parte, che lo imposta su qualcosa come

so_far = " " * len(word) 

?

Edit:

provare qualcosa di simile

print "%d/%d" % (new, so_far) 

prima della riga che genera l'errore, in modo da poter vedere esattamente ciò che va storto. L'unica cosa che posso pensare è che so_far è in un ambito diverso, e in realtà non stai usando l'istanza che pensi.

+0

Scusate, avrei dovuto includerlo ma ho dimenticato. Ho già avuto la variabile inizializzata nello stesso modo so_far = "-" * len (word) – Darkphenom

+0

Modificata la mia risposta per aggiungere un modo per eseguire il debug e un altro suggerimento su cosa potrebbe essere sbagliato. – CNeo

+0

E sembra che @Rob Wouters abbia capito, l'ho perso. Ha ragione, quindi_far dovrebbe essere al di fuori del blocco :) – CNeo

0

Ci sono stati diversi problemi nel codice. Qui si dispone di una versione funzionante è possibile analizzare (lascia impostato 'ciao' come la parola di destinazione):

word = 'hello' 
so_far = "-" * len(word)  # Create variable so_far to contain the current guess 

while word != so_far:   # if still not complete 
    print(so_far) 
    guess = input('>> ')  # get a char guess 

    if guess in word: 
     print("\nYes!", guess, "is in the word!") 

     new = "" 
     for i in range(len(word)): 
      if guess == word[i]: 
       new += guess  # fill the position with new value 
      else: 
       new += so_far[i] # same value as before 
     so_far = new 
    else: 
     print("try_again") 

print('finish') 

ho provato a scrivere per py3k con un IDE py2k, stare attenti con gli errori.

+0

La tua frase di rottura è sbagliata lì. –

+1

Rob, hai ragione. – joaquin

+0

Sì, ho solo tirato fuori un piccolo segmento di codice per arrivare al punto. Grazie per averlo fatto notare però. – Darkphenom

Problemi correlati