2010-01-29 22 views
8

En python, ¿las cadenas son mutables? La línea de someString[3] = "a" lanza el errorReemplazar un carácter de una cadena en python

TypeError: 'str' object does not support item assignment

Puedo ver por qué (como lo podría haber escrito someString [3] = "prueba" y que, obviamente, sería ilegal), pero no es un método de hacer esto en Python?

+0

que tienen una cadena binaria y en ciertas condiciones, quiero voltear una específica 0 a 1. – Chris

+0

Pero en general, me gustaría lanzar una letra específica xay. En este momento estoy tratando con cadenas binarias, pero es una consulta general – Chris

+0

Otro consejo: si estás haciendo "cadenas binarias", es decir, cadenas que consisten solo de 1s y 0s, echa un vistazo a una biblioteca como BitVector, que es más rápida y más conveniente para la manipulación del vector de bits. Además, vea una pregunta sobre vectores de bits en Python en http://stackoverflow.com/questions/2147848/how-do-i-represent-and-work-with-n-bit-vectors-in-python/2147873 # 2147873 –

Respuesta

13

Las cadenas de Python son inmutables, por lo que no admiten la asignación de elementos o sectores. Tendrá que crear una nueva cadena usando, por ejemplo, someString[:3] + 'a' + someString[4:] o algún otro enfoque adecuado.

8

En lugar de almacenar su valor como una cadena, se puede utilizar una lista de caracteres:

>>> l = list('foobar') 
>>> l[3] = 'f' 
>>> l[5] = 'n' 

Entonces, si desea volver a convertirlo en una cadena para mostrarlo, utilice esto:

>>> ''.join(l) 
'foofan' 

Si cambia muchos caracteres de uno en uno, este método será considerablemente más rápido que crear una nueva cadena cada vez que cambie un carácter.

+1

También me gusta esta respuesta. Gracias una tonelada. Necesito acostumbrarme a la programación estilo pitón :) – Chris

+0

@Chris: Recomiendo mucho este libro: http://www.amazon.ca/Programming-Python-Complete-Introduction-Language/dp/0137129297/ref=sr_1_6? ie = UTF8 & s = books & qid = 1264800285 & sr = 8-6 – MikeyB

2

En las suficientes pitones también puede usar el tipo integrado bytearray, que es mutable. Vea la documentación de stdlib. Pero "lo suficientemente nuevo" aquí significa 2.6 o más, por lo que no es necesariamente una opción.

En las pitones más viejas tiene que crear un str nuevo como se mencionó anteriormente, ya que estos son inmutables. Ese suele ser el enfoque más legible, pero a veces se usa un tipo diferente de secuencia mutable (como una lista de caracteres, o posiblemente un array.array). array.array es un poco torpe, y generalmente se evita.

1
>>> import ctypes 
>>> s = "1234567890" 
>>> mutable = ctypes.create_string_buffer(s) 
>>> mutable[3] = "a" 
>>> print mutable.value 
123a567890 
Cuestiones relacionadas