No estoy seguro de por qué las cuerdas y las tuplas se hicieron para ser inmutables; ¿Cuáles son las ventajas y desventajas de hacerlos inmutables?¿Por qué las cadenas de pitón y las tuplas se vuelven inmutables?
Respuesta
Una de ellas es el rendimiento: sabiendo que una cadena es inmutable hace que sea fácil de sentar a cabo en el momento de la construcción - fijo e invariable de almacenamiento requisitos. Esta es también una de las razones para distinguir entre tuplas y listas. Esto también permite la implementación para reutilizar de forma segura los objetos de cadena . Por ejemplo, la implementación CPython utiliza objetos preasignados para cadenas de un solo carácter, y generalmente devuelve la cadena original para operaciones de cadena que no cambia el contenido.
La otra es que las cadenas en Python se consideran como "elementales" como números. Ninguna cantidad de actividad va a cambiar el valor 8 a cualquier otra cosa, y en Python, ninguna cantidad de actividad cambiará la cadena "ocho" a cualquier otra cosa.
http://effbot.org/pyfaq/why-are-python-strings-immutable.htm
pros: Rendimiento
contras: no se puede cambiar mutables.
profesionales: no puede cambiarlos –
Una gran ventaja de hacerlos inmutables es que se pueden usar como claves en un diccionario. Estoy seguro de que las estructuras internas de datos utilizadas por los diccionarios se desordenarían bastante si se permitiera que las claves cambiaran.
Buuuuut puede ingresar una instancia de objeto creada por el usuario, que obviamente es mutable. La "clave" entonces es probablemente solo la dirección de la memoria, y si las cadenas fueran mutables, aún así podría ingresar por su dirección de memoria única. – Triptych
@Triptych que no sería lo que quieres para las cadenas, querrás que tecleen por valor, de lo contrario los diccionarios serían de poca utilidad ... – Hejazzman
@Hejazzman no es así como funcionan los dictados python. El valor de cadena literal no se usa como la clave dict, sino que se toma un hash de la cadena. Pruébalo a ti mismo con ''abc' .__ hash __()'. – Triptych
Imagine un lenguaje llamado FakeMutablePython, donde puede alterar las cadenas utilizando la asignación lista y tal (como mystr[0] = 'a'
)
a = "abc"
Eso crea una entrada en la memoria en la dirección de memoria 0x1, que contiene "abc", y el identificador a
apuntando a él.
Ahora, dicen que haces ..
b = a
Esto crea el identificador b
y también apunta a la misma dirección de memoria de 0x1
Ahora, si la cadena eran mutables, y se cambia b
:
b[0] = 'z'
Esto altera el primer byte de la cadena almacenada en 0x1 a z
.. Como el identificador a
está señalando aquí para, de este modo que la cadena sería alterado también, por lo ..
print a
print b
..would tanto la producción zbc
Esto podría hacer para un comportamiento muy extraño, inesperado.claves del diccionario sería un buen ejemplo de esto:
mykey = 'abc'
mydict = {
mykey: 123,
'zbc': 321
}
anotherstring = mykey
anotherstring[0] = 'z'
Ahora en FakeMutablePython, las cosas son bastante extraño - que inicialmente tiene dos teclas en el diccionario, "abc" y "ZBC" .. A continuación, se altera el "abc "cadena (a través del identificador anotherstring
) a" zbc ", por lo que el dict tiene dos claves," zbc "y" zbc "...
Una solución a esta rareza sería, cada vez que asigne una cadena a un identificador (o úselo como una clave dict), copia la cadena de 0x1 a 0x2.
Esto evita lo anterior, pero ¿qué sucede si tiene una cadena que requiere 200 MB de memoria?
a = "really, really long string [...]"
b = a
De repente, ¿tu script toma 400MB de memoria? Esto no es muy bueno
¿Qué tal si lo apuntamos a la misma dirección de memoria, hasta que la modifiquemos? Copy on write. El problema es que esto puede ser bastante complicado de hacer ...
Aquí es donde entra la inmutabilidad. En lugar de requerir que el método .replace()
copie la cadena de la memoria en una nueva dirección, modifíquela y devuélvala ... simplemente haga todas las cadenas inmutables, y así la función debe crear una nueva cadena para regresar. Esto explica el siguiente código:
a = "abc"
b = a.replace("a", "z")
Y se demuestra por:
>>> a = 'abc'
>>> b = a
>>> id(a) == id(b)
True
>>> b = b.replace("a", "z")
>>> id(a) == id(b)
False
(la función id()
devuelve la dirección de memoria del objeto)
+1 La mejor respuesta. De Verdad. – wassimans
¡La mejor explicación que he escuchado! –
así que si digo a = "abc", b = "abcd" ¿compartirá abc? como b [: 4] es un? – Dineshkumar
tipos inmutables son conceptualmente mucho más simple que los mutables . Por ejemplo, no tiene que meterse con los constructores de copia o const-correctness como en C++. Cuantos más tipos sean inmutables, más fácil será el idioma. Por lo tanto, los lenguajes más fáciles son los funcionales puros sin ningún estado global (porque el cálculo lambda es mucho más fácil que las máquinas de Turing, e igualmente poderoso), aunque mucha gente no parece apreciar esto.
Perl tiene cadenas mutables y parece funcionar muy bien. Lo anterior parece mucho movimiento de manos y racionalización para una decisión de diseño arbitraria.
Mi respuesta a la pregunta de por qué Python tiene cuerdas inmutables, porque el creador de Python, Guido van Rossum, lo quería de esa manera y ahora tiene legiones de admiradores que defenderán esa decisión arbitraria hasta su último aliento.
Podría plantear una pregunta similar de por qué Perl no tiene cadenas inmutables y un montón de gente escribiría cuán horrible es el concepto mismo de cadenas inmutables y por qué es la idea más exacta de Bestest (TM) que Perl doesn los tengo.
Perl realmente no tiene cadenas: tiene escalares, que pueden comportarse como cadenas o números (más de un tipo de estos últimos). Si los escalares fueran inmutables, se convertiría en Perl puramente funcional y los programadores de Perl de todo el mundo se suicidarían asignándose undef a ellos mismos. –
- 1. ¿Las cadenas StringBuilder son inmutables?
- 2. ¿Por qué las cadenas se llaman "cadenas"?
- 3. ¿Las cadenas de Delphi son inmutables?
- 4. ¿Por qué las cadenas de Python son inmutables? Las mejores prácticas para su uso
- 5. ¿Por qué las cadenas son inmutables en muchos lenguajes de programación?
- 6. ¿Las cadenas de Python no son inmutables? Entonces, ¿por qué funciona un + "" + b?
- 7. listas Conversión de tuplas a las cadenas de Python
- 8. ¿Por qué las tuplas tienen uses_allocator pero los pares no?
- 9. suma Python, ¿por qué no las cadenas?
- 10. ¿Por qué las funciones de valor escalar de SQL Server se vuelven más lentas?
- 11. ¿para qué son adecuadas las tuplas?
- 12. corta en cadenas inmutables por referencia y no copia
- 13. Las inserciones SQLite se vuelven más lentas incluso con transacciones
- 14. Las extensiones enumerables de LINQ están ocultas en las cadenas ... ¿por qué y cómo?
- 15. ¿Cuáles son las ventajas reales de las colecciones inmutables?
- 16. ¿La comparación de cadenas == solo funciona porque las cadenas son inmutables?
- 17. Agregar tuplas a las listas
- 18. Java cadenas inmutables confusión
- 19. pitón: lista de tuplas de listas
- 20. La instrucción "es" de Python y las tuplas
- 21. ORM apoyo a las clases inmutables
- 22. Google Maps v3 - ¿Por qué se vuelven LatLngBounds.contains falsa
- 23. que vuelven tipos de cadenas anulables
- 24. ¿Debo cerrar las cadenas devueltas por Assembly.GetManifestResourceStream?
- 25. ¿Cómo se almacenan las cadenas de C++?
- 26. ¿Cómo se manejan las cadenas en C++?
- 27. ¿Por qué .NET crea nuevas subcadenas en lugar de señalar las cadenas existentes?
- 28. Dado que las cadenas son inmutables, ¿las variables con valores de cadena idénticos apuntan al mismo objeto de cadena?
- 29. ¿Se puede sublime el color de las cadenas de Python de forma diferente a las cadenas de una sola línea?
- 30. ¿Todas las clases finales son inmutables?
que no sea la implementación interna del intérprete de Python, ¿este diseño tiene sentido en la escritura de programas? (por ejemplo, ¿será más fácil si las tuplas y las cadenas fueran mutables?) si lo hace, ¿cuáles serían los ejemplos de elegir listas de tuplas inmutables? (o quizás, cadenas mutables frente a cadenas de pitón) – user186477
Existe todo un estilo de programación llamado Programación Funcional donde todo es inmutable. http://en.wikipedia.org/wiki/Functional_programming –
Python * SÍ * tiene cadenas mutables y tuplas; se deletrean 'bytearray' y' list', respectivamente. – SingleNegationElimination