- ¿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?
- Estoy acostumbrado a cadenas mutables, como las de C. ¿Cómo se supone que programe sin cadenas mutables? ¿Hay algunas mejores prácticas?
Respuesta
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:]
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
@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'). –
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.
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.
- Los objetos inmutables son automáticamente multi-hilo.
- 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.
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.
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
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. –
@delnan: Ruby? Eso no es parte de esta pregunta. –
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.
- 1. ¿Las cadenas StringBuilder son inmutables?
- 2. ¿Qué son las mejores prácticas de MEF?
- 3. ¿Las cadenas de Delphi son inmutables?
- 4. ¿Las cadenas de Python no son inmutables? Entonces, ¿por qué funciona un + "" + b?
- 5. Índices MySQL: ¿cuáles son las mejores prácticas?
- 6. ¿Por qué las cadenas son inmutables en muchos lenguajes de programación?
- 7. ¿Cuáles son las mejores prácticas de Python para las constantes de clave dict del diccionario?
- 8. ¿Cuáles son las mejores prácticas para usar Z2 Availability Zones?
- 9. C#: concatenación de cadenas más legible. las mejores prácticas
- 10. nhibernate: ¿cuáles son las mejores prácticas para implementar la igualdad?
- 11. ¿Cuáles son las mejores prácticas para repositorios de horno?
- 12. mejores prácticas de C++ para las constantes
- 13. ¿Cuáles son las mejores prácticas para diseñar esquemas XML?
- 14. ¿Cuáles son las mejores prácticas para registrar un error?
- 15. Python "mejores prácticas de formato" para las listas, diccionario, etc.
- 16. ¿Cuáles son las mejores prácticas para manejar cadenas Unicode en C#?
- 17. ¿Por qué las cadenas de pitón y las tuplas se vuelven inmutables?
- 18. ¿Cuáles son algunas de las mejores prácticas de uso de la Biblioteca estándar de C++?
- 19. ¿Cuáles son las mejores prácticas para la programación de diseño por contrato?
- 20. ¿Cuáles son las mejores prácticas en la interoperabilidad del lenguaje?
- 21. suma Python, ¿por qué no las cadenas?
- 22. Mejores prácticas en las configuraciones de configuración
- 23. CSS3 - ¿Cuáles son las mejores prácticas de rendimiento?
- 24. Doctrine 2: las mejores prácticas para i18n?
- 25. ¿Cuáles son las mejores prácticas al usar SWIG con C#?
- 26. ¿Cuáles son las mejores prácticas para actualizar automáticamente las aplicaciones PHP + MySQL?
- 27. ¿Cuáles son las "consecuencias prácticas" del uso de referencias suaves?
- 28. ¿Cuáles son las herramientas y las mejores prácticas para probar servicios web?
- 29. linq2sql: Singleton o el uso, las mejores prácticas
- 30. MVC3 y EF Data first: ¿cuáles son las mejores prácticas?
Hay un tipo de cadena mutable, se llama ['bytearray'] (http://docs.python.org/library/functions.html#bytearray) –
@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. –