mutables inmutables inmutable ejemplos datos python immutability mutable language-theory

python - ejemplos - ¿Cuál es la teoría detrás de los tipos mutables e inmutables?



mutable e inmutable ejemplos (4)

En C no hay un concepto explícito de inmutable porque el lenguaje se basa en la copia semántica. En Python, en cambio, los valores siempre se pasan por referencia y la inmutabilidad juega un papel importante para mantener el lenguaje manejable.

¡En Python no tienes punteros porque todo es un puntero! Imagina lo que podría significar para un programa de Python que un número par de objetos podría cambiar de valor con el tiempo ... estarías obligado a jugar trucos como

class Shape: def __init__(self, points): self.points = points[:] # make a copy of the list

no solo para listas y dictados, sino también para valores numéricos y cadenas.

Básicamente, en Python, algunos tipos tienen instancias inmutables porque normalmente se usan como "valores" y no te importa la identidad. En los casos excepcionales en los que necesita, por ejemplo, un objeto mutable con un valor numérico, debe resumirlo explícitamente en, por ejemplo, una instancia de clase.

En otros lenguajes basados ​​sustancialmente en la semántica de referencia como LISP, la inmutabilidad es una opción que le queda al programador y no una restricción, incluso si muchas funciones e idiomas lo admiten (un gran porcentaje de las funciones de biblioteca estándar de LISP no son destructivas y, de hecho, es una especie de lástima que los destructivos no siempre se distinguen claramente por el nombre).

Así, por ejemplo, las cadenas son LISP mutables, pero probablemente no muchos programas LISP realmente modifican las cadenas en su lugar porque eso significaría renunciar a la buena posibilidad de compartir y requeriría copiar explícitamente cadenas en muchos lugares (en la mayoría de los casos, las cadenas son solo valores, no objetos en que te importa la identidad). ¿Son inmutables las cuerdas en LISP? No. ¿Los programas los están mutando? Casi nunca.

No dejar una opción al programador está en el espíritu del lenguaje Python. Se siente bien cuando las elecciones a las que se ve obligado están en línea con su idea ... menos decisiones y las cosas son exactamente como las quería.

Sin embargo, hay en mi opinión dos peligros diferentes con este enfoque:

  1. Los problemas surgen cuando esas elecciones prefabricadas NO están en línea con respecto a lo que le gustaría o necesita hacer. Python es un lenguaje maravilloso, pero con un dictador diferente podría convertirse en el infierno puro.

  2. Comprender y hacer choiches te obliga a pensar y expande tu mente. En cambio, al no elegir, solo tiene una jaula en su mente y después de un tiempo puede que ni siquiera se dé cuenta de que lo que está usando es solo UNA posibilidad, no la única posibilidad. Después de un tiempo, puedes comenzar a pensar que "las cosas DEBEN hacerse de esta manera": ni siquiera te sientes forzado porque tu mente ya ha sido "mutilada".

Una de las cosas que admiro de Python es su distinción entre tipos mutables e inmutables. Habiendo pasado un tiempo programando en c antes de llegar a Python, me sorprendió la facilidad con la que Python elimina todas las complejidades de la desreferenciación de punteros que me vuelven loco en c. En Python, todo funciona como esperaba, y rápidamente me di cuenta de que la distinción mutable / inmutable juega un papel importante en eso.

Por supuesto, todavía quedan algunas arrugas (los valores predeterminados de los argumentos de función mutable son un ejemplo notable), pero en general, creo que la distinción mutable / inmutable aclara en gran medida la cuestión de qué variables y sus valores son y cómo deben comportarse.

¿Pero de dónde viene? Debo suponer que GvR no fue la primera persona en concebir esta distinción, y que Python no fue el primer idioma en usarla. Me interesa escuchar acerca de los idiomas anteriores que usaron este concepto, así como las discusiones teóricas tempranas sobre el mismo.



Si te gusta la idea de la inmutabilidad, deberías revisar un lenguaje funcional puro. En Haskell, todas las variables (puras) son inmutables (aún así se las denomina "variables", pero ya está). Es una gran idea: tanto usted como el compilador saben que pasar algo a una función no puede cambiarlo de ninguna manera.


El objetivo C está cargado con distinciones mutables / inmutables (hasta el punto donde hay tanto NSString como NSMutableString , por ejemplo); Es anterior a Python por unos 8 años. Smalltalk, de donde Objective C heredó gran parte de su diseño OO, usa el concepto en menor medida (en particular, las cadenas no son inmutables; la tendencia en estos días es hacia cadenas inmutables como en Python, Ruby, etc.).