2010-02-03 6 views
6

quiero cambiar el valor de un índice de la cadena en particular, pero por desgraciaLa superación de las "desventajas" de la inmutabilidad de cadena

string[4] = "a" 

plantea una TypeError, porque las cadenas son inmutables ("Asignación de elemento no es compatible").

Así que en lugar de eso utiliza el bien torpe

string = string[:4] + "a" + string[4:] 

¿Hay una mejor manera de hacer esto?

+0

¿Cómo es la segunda torpe? Parece describir muy claramente el resultado. Además, parece insertar un carácter en lugar de reemplazarlo (una función que no tiene el primer ejemplo). El primero se basa en algunas suposiciones sobre el estado "antes" y "después" de la cadena. –

Respuesta

8

Las cadenas en Python son inmutables, al igual que los números y las tuplas. Esto significa que puede crearlos, moverlos, pero no cambiarlos. Por qué esto es tan ? Por algunas razones (puede encontrar una mejor discusión en línea):

  • Por diseño, las cadenas en Python se consideran elementales e inalterables. Esto estimula estilos de programación mejores y más seguros.
  • La inmutabilidad de las cadenas tiene beneficios de eficiencia, principalmente en el área de menores requisitos de almacenamiento.
  • También hace que las cadenas más seguro de usar como teclas de diccionario

Si nos fijamos en la web de Python un poco, usted notará que el consejo más frecuente de "cómo cambiar mi cadena" es "diseñar su código para que no tenga que cambiarlo ". Muy bien, pero ¿qué otras opciones hay? Éstos son algunos:

  • name = name [: 2] + 'G' + name [3:] - esta es una forma ineficiente de hacer el trabajo. La semántica de corte de Python garantiza que esto funcione correctamente en todos los casos (siempre y cuando su índice esté dentro del rango), pero involucrando varias copias de cadenas y concatenaciones, no es la mejor opción para un código eficiente. Aunque si no te importa (y la mayoría de las veces es así), es una solución sólida.
  • Utilice la clase MutableString del módulo UserString. Aunque no es más eficiente que el método anterior (realiza el mismo truco debajo del capó), es más consistente sintácticamente con el uso normal de cadenas.
  • Use una lista en lugar de una cadena para almacenar datos mutables. Convierte de ida y vuelta usando la lista y únete. Dependiendo de lo que realmente necesite, ord y chr también pueden ser útiles.
  • Use un objeto de matriz. Esta es quizás la mejor opción si usa la cadena para contener datos restringidos, como bytes "binarios", y quiere un código rápido.

un plagio de my own page en el entendimiento de Python :-)

3
mystring=list("abcdef") 
mystring[4]="Z" 
print ''.join(mystring) 
+0

Eww, '' .join() es bastante desagradable. –

+3

No realmente. 'str.join()' es útil para todo tipo de cosas, y esta es una de ellas. ''' .join (...)' es un modismo bastante común. –

+0

str.join es útil para construir cadenas, pero no creo que esta sea una buena idea. Si solo estás reemplazando a un personaje, va a hacer mucho más trabajo.Además, intente 'a = list (u" か "* 1000000)'; eso usa alrededor de 40 megas de memoria en mi sistema. Está mejor con 'def replace_char (s, idx, c): return s [: idx] + c + s [idx:]' a menos que esté haciendo muchas de ellas a la vez. –

0
>>> from UserString import MutableString 
>>> s = MutableString('abcd') 
>>> s[2] = 'e' 
>>> print s 
abed 
+0

De los documentos de la biblioteca estándar de Python: esta clase UserString de este módulo solo está disponible para compatibilidad con versiones anteriores. Si está escribiendo un código que no necesita trabajar con las versiones de Python anteriores a Python 2.2, considere la creación de subclases directamente desde el tipo str incorporado en lugar de utilizar UserString (no hay un built-in equivalente a MutableString). –

+0

De los documentos para MutableString: "Pero el propósito de esta clase es educativo: ... Una solución más rápida y mejor es reescribir el programa usando listas". http://pydoc.org/2.2.3/UserString.html – asveikau

+0

Además, MutableString está en desuso en 2.6 y eliminado en 3.0. – jamessan

Cuestiones relacionadas