2011-12-30 21 views
35
  1. ¿Cuáles son las razones de diseño de hacer cadenas de Python son inmutables? ¿Cómo hace la programación más fácil?
  2. Estoy acostumbrado a cadenas mutables, como las de C. ¿Cómo se supone que programe sin cadenas mutables? ¿Hay algunas mejores prácticas?
+1

Hay un tipo de cadena mutable, se llama ['bytearray'] (http://docs.python.org/library/functions.html#bytearray) –

+5

@JanneKarila: La semántica, sin embargo, es muy diferente. Por ejemplo, no maneja caracteres Unicode, solo bytes. No es una cadena adecuada, con métodos de cadena, es una matriz ajustable de bytes. –

Respuesta

37

Cuando recibe una cadena, usted estará seguro de que se mantiene el mismo. Supongamos que construiría un Foo como se muestra a continuación con un argumento de cadena, y luego modificaría la cadena; a continuación, el nombre Foo 's cambia de repente:

class Foo(object): 
    def __init__(self, name): 
     self.name = name 

name = "Hello" 
foo = Foo(name) 
name[0] = "J" 

Con cadenas mutables, que tendría que hacer copias de todo el tiempo para evitar que sucedan cosas malas.

También permite la conveniencia de que un solo carácter no es diferente de una cadena de longitud uno, por lo que todos los operadores de cadenas de caracteres se aplican también.

Y, por último, si las cadenas no son inmutables, no podría usarlas de manera confiable como claves en un dict, ya que su valor de hash podría cambiar repentinamente.

En cuanto a la programación con cadenas inmutables, simplemente acostúmbrate a tratarlas de la misma manera que tratas a los números: como valores, no como objetos. Cambiar la primera letra del name sería

name = "J" + name[1:] 
+3

Sooooooo Sé que esto es un poco tarde, pero ¿podrías explicar a qué te refieres con que las cadenas mutables no son confiables en los dicts? List son mutables, pero se pueden poner en dicts, ¿qué haría que las cadenas mutables no sean confiables? – wnnmaw

+6

@wnnmaw Lo que larsmans significa es que no sería capaz de usar cadenas confiablemente como claves para un dict, ya que modificar una cadena cambiaría su hash, lo que cambiaría el cubo al que iría la cadena. Puede ver esto con listas usted mismo tratando de usar una lista como clave de un diccionario ('a = {}; a [[1,2]] = 1' arroja un' TypeError'). –

2

cadenas inmutables hace mucho más fácil la programación, por lo que C# y Java los utilizan también.

Tenía cuerdas estado mutable, que no sería capaz de confiar en cualquier cadena proporcionada externamente, ya que un interlocutor no deseado podría cambiarlo por debajo de usted.
También haría mucho más difícil el multi-threading.

3

La mayoría de las lenguas tienen cadenas inmutables. Esto incluye Java, Python y C#. Por lo general, al concatenar cadenas, el lenguaje asigna una cadena completamente nueva y copia el contenido de las dos cadenas en la nueva cadena.

inmutabilidad tiende a facilitar la programación. Especialmente cuando se trata de un entorno de subprocesos múltiples.

5
  1. Los objetos inmutables son automáticamente multi-hilo.
  2. se dará cuenta de que el uso de cadenas de Python es trivialmente fácil en comparación con el dolor extremo asociado con cadenas en C.
5

cadenas inmutables simplifican en gran medida la asignación de memoria en comparación con cadenas de C: no se adivina a una eslora igual o superior a asignar que la esperanza de una asignación excesiva suficiente.

Son más seguro: no se puede tener un desbordamiento de búfer de la manera que pueda en C.

Sólo hay un caso mutable uso de cadenas.

  • sustituir una subcadena o un solo carácter

Todos los demás casos de uso cadena (concatenación, buscar, etc., etc.) la mutabilidad no importa. En todos los demás casos, la mutabilidad no importa.

Si desea reemplazar un carácter o una subcadena en Python, sólo tiene que crear una nueva cadena

x = x[:place] + replacement + x[place+1:] 

Ese es el único código que novela o distintivo.


Por razones que no entiendo, parece importante agregar lo siguiente.

"Hay otras formas de evitar un desbordamiento del búfer de cadena que las cadenas inmutables".

Para los propósitos de esta pregunta (específicamente sobre Python) las cadenas inmutables tienen una agradable consecuencia de no desbordamientos de búfer. Para otros idiomas, se aplican otros principios, reglas y matices.

+2

Ruby (como un ejemplo) tiene cadenas mutables, y tiene administración de memoria automática y no puede tener desbordamientos de búfer. En cuanto a la sustitución de subcadenas como el único caso de uso, ¿qué pasa con (in-place-) anexando? -1 – delnan

+0

No hay un "anexo en el lugar". Eso se está agregando. 'x = x + y' O 'x + = y'. No se puede decir si estaba en el lugar o hecho con cadenas inmutables. –

+0

@delnan: Ruby? Eso no es parte de esta pregunta. –

5

Las cadenas inmutables pueden ser claves en diccionarios y estructuras de datos similares, sin la necesidad de copiar las cadenas. Es más fácil hacer un envoltorio mutable alrededor de una cuerda inmutable que al revés.

Cuestiones relacionadas