string.upper () y .upper () no se ejecutarán

Tengo el siguiente bit de código:

def test(): fragment = '' fragment = raw_input('Enter input') while fragment not in string.ascii_letters: fragment = raw_input('Invalid character entered, try again: ') fragment.upper() print fragment*3 

Sin embargo, cuando lo ejecuto, por ejemplo, para un valor de entrada de p , el fragment se imprime como ‘ppp’ – todo en minúscula, es decir, la línea fragment.upper() no se ejecuta. Lo mismo ocurre si sustituyo esa línea con string.upper(fragment) (y al agregar una cadena de importación al principio). ¿Alguien puede decirme lo que estoy haciendo mal?

Las cuerdas son inmutables . Por lo tanto, funciones como str.upper() no modificarán la str sino que devolverán una nueva cadena.

 >>> name = "xyz" >>> name.upper() 'XYZ' >>> print name xyz # Notice that it's still in lower case. >>> name_upper = name.upper() >>> print name_upper XYZ 

Entonces, en lugar de fragment.upper() en tu código, necesitas hacer new_variable = fragment.upper() y luego usar esta new_variable .

No se está dando cuenta de que las cadenas en Python son inmutables y que los métodos y operaciones de cadenas devuelven cadenas nuevas.

 >>> print 'ppp'.upper() PPP 

La cadena es un objeto inmutable, así que cuando llamas

 string.upper() 

Python haría una copia de la cadena, y cuando vuelvas a llamar

 print string 

, sería la cadena original, que está en minúscula. Así que cuando necesites su versión en mayúsculas, tienes que decir:

 print string.upper()