2012-01-03 35 views
9

Actualmente estoy aprendiendo python de un libro llamado 'Python para el principiante absoluto (tercera edición)'. Hay un ejercicio en el libro que describe el código de un juego del ahorcado. Seguí junto con este código, pero sigo recibiendo un error en el medio del programa.Error de Python: "IndexError: índice de cadena fuera de rango"

Este es el código que está causando el 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 

Este es también el error que devuelve:

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

Podría alguien ayudarme con lo que está mal y lo que puedo hacer para arreglarlo?

Edit: inicializa la variable so_far así:

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

Esto es menor y no está relacionado con su pregunta, pero no necesita i = 0. El bucle for establece automáticamente la variable de bucle cuando se inicia incluso si no se ha definido todavía. –

+0

@Chad Sí, tienes razón. No recuerdo por qué lo metí en: S – Darkphenom

Respuesta

11

Parece que ha sangrado so_far = new demasiado. Pruebe esto:

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 de ojo de águila. – hochl

+0

Sí, ¡muchas gracias! ¡Me resulta un poco confuso tener sangría para cosas que estaría acostumbrado a poner llaves! – Darkphenom

5

Usted está interactuando sobre una cuerda (word), pero a continuación, utilizando el índice en que para buscar un personaje de so_far. No hay garantía de que estas dos cadenas tengan la misma longitud.

1

Este error podría ocurrir cuando el número de conjeturas (so_far) es menor que la longitud de la palabra. ¿Te perdiste una inicialización para la variable tan_fuera en algún lugar, que lo establece en algo como

so_far = " " * len(word) 

?

Editar:

intentar algo así como

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

antes de la línea que lanza el error, para que pueda ver exactamente lo que va mal. Lo único que se me ocurre es que so_far tiene un alcance diferente, y en realidad no estás usando la instancia que crees.

+0

Lo siento, debería haber incluido esto, pero lo olvidé. Ya tenía esa variable inicializada de la misma manera so_far = "-" * len (palabra) – Darkphenom

+0

Edité mi respuesta para agregar una forma de depurar, y otra sugerencia sobre lo que puede estar mal. – CNeo

+0

Y parece que @Rob Wouters lo consiguió, me lo perdí. Tiene razón, por lo que debería estar fuera del bloque :) – CNeo

0

Hubo varios problemas en el código. Aquí tienes una versión funcional se puede analizar (Lets establece 'hola' como la palabra de destino):

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') 

Traté de escribir para py3k con un IDE py2k, tener cuidado con los errores.

+0

Su declaración de interrupción está mal allí. –

+1

Rob, tienes razón – joaquin

+0

Sí, solo saqué un pequeño segmento de código para llegar al punto. Gracias por señalarlo. – Darkphenom

Cuestiones relacionadas