Python: El sagrado misterio de la inmutabilidad

Objetivo: comprender los conceptos críticos de mutabilidad, inmutabilidad y referencia en Python.

Estás ante un artículo esencial en tu formación como programador en Python. Te llevará sólo cinco minutos leerlo, pero puede dar luz sobre conceptos que no resultan ni mucho menos obvios cuando se comienza con Python, particularmente si procedes de otros lenguajes de programación.

Por lo general, cuando empezamos a estudiar un lenguaje de programación, se nos cuenta que existen distintos tipos de datos, tales como numéricos, strings, etc.

En Python se nos enseña algo más: determinados tipos son inmutables y otros mutables. Los números, los strings y las tuplas son inmutables. Por el contrario, las listas son mutables.

Ahí ya empiezan a sacudirnos algo; pero nuestro cerebro, al que no le gustan las dudas, intenta buscar una respuesta coherente para no quedarse atascado y seguir avanzando. Claro: los números, los strings y las tuplas no se pueden modificar, mientras que las listas .

Bueno, bueno, un momento:

>>> a = 5
>>> b = 'pradera'

La variable a contiene un número; la variable b contiene un string. Hemos dicho que los números y los strings son inmutables. ¿Significa eso que no podemos modificar ni a ni b?

>>> a = 6
>>> b = 'casa'
>>> a
6
>>> b
'casa'

Pues sí, se pueden modificar (de no ser así Python tendría un serio problema), por lo que eso de la inmutabilidad debe de significar algo diferente. Decir que un tupla es inmutable, pero una lista no, ¿significará acaso que ésta tiene cosquillas pero la otra no?

Más adelante cuando estudiamos las listas y las tuplas creemos haber comprendido, al fin, el misterio.

>>> lista = [1, 2, 3, 4]
>>> lista[0] = 5
>>> lista
[5, 2, 3, 4]

Bien: las listas, mutables, se pueden modificar.

>>> tupla = (1, 2, 3, 4)
>>> tupla[0] = 5
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    tupla[0] = 5
TypeError: 'tuple' object does not support item assignment

En cambio, las tuplas, inmutables, no, como podemos comprobar.

Aprendemos también que los strings también son secuencias, como las listas y las tuplas y, como tales, podemos acceder a sus caracteres individuales:

>>> serie = 'la casa de la pradera'
>>> serie[3]
'c'

Pero no podemos modificarlos:

>>> serie[3] = 'k'
Traceback (most recent call last):
  File "<pyshell#60>", line 1, in <module>
    serie[3] = 'k'
TypeError: 'str' object does not support item assignment

Un error semejante al que recibimos al tratar de modificar una tupla. Esto hace que cuadre todo: los strings son inmutables, también.

Pero ¿cuadra realmente todo? Parece que sí, aunque no aparenta tener mucho sentido práctico eso de la inmutabilidad de los números.

Tarde o temprano, cualquier estudiante de Python que ya ha programado en otros lenguajes se enfrenta al siguiente misterio.

Observémoslo muy despacio:

>>> x = 5
>>> y = x

Pregunta: ¿cuánto crees que vale y?

En efecto, 5:

>>> y
5

Modifiquemos ahora el valor de x:

>>> x = 6

¿Cuánto crees que valdrá ahora y?

Vamos a ver, no me asustes: x e y son dos variables diferentes, cada una con su propio contenido; por lo tanto y tiene que seguir valiendo 5, aunque hayas modificado x, ¿no?

En efecto, así es:

>>> y
5

Veamos otro ejemplo. Ahora x es una lista:

>>> x = [1, 2, 3, 4]
>>> y = x
>>> y
[1, 2, 3, 4]

Voy a modificar el valor de x:

>>> x[0] = 5
>>> x
[5, 2, 3, 4]

¿Cuánto crees que valdrá ahora y?

Por la lógica anterior, x e y son dos variables diferentes, cada una con su propio contenido, por lo que cabría esperar que el valor de y fuera [1, 2, 3, 4].

Pero no es así:

>>> y
[5, 2, 3, 4]

Esto rompe completamente nuestros esquemas. Si somos programadores en otros lenguajes una alarma nos sacude inmediatamente.

¿Por qué al modificar x ha cambiado y también?

De acuerdo: los números son inmutables, pero las listas no. ¿Pero qué tiene que ver esto con el hecho de que se haya modificado el valor de y?

Para resolver el misterio hace falta un una nueva pieza clave: el concepto de referencia.

Veamos lo que está sucediendo realmente entre bastidores:

>>> x = 5

En Python, todo son objetos. Se acaba de crear uno nuevo: un número de valor 5.

Este objeto, que reside en algún lugar de la memoria, posee un identificador único que lo diferencia del resto de los objetos. Piensa en él como si fuera su DNI (es, en realidad, la dirección de memoria en la que reside el objeto).

Para conocer ese identificador, Python dispone de la función id():

>>> id(5)
137396064

Y ahora el concepto crítico: la variable x no es más que una referencia a ese objeto. A efectos prácticos, es como si se tratara de un puntero (empleando conceptos de otros lenguajes) a ese objeto. No contiene su valor, sino una referencia a él.

La función id(), aplicada a una variable, nos devuelve el id del objeto al que referencia, por lo que obtenemos el mismo valor que antes:

>>> id(x)
137396064

Proseguimos; asignamos a la variable y el valor de x:

>>> y = x

Observa ahora cuidadosamente qué pasa al preguntar por el id del objeto al que referencia y:

>>> id(y)
137396064

Exactamente el mismo al que referencia x. Tanto x como y apuntan al mismo objeto.

Este es un concepto radicalmente distinto al de las variables en otros lenguajes, en los que el contenido de x y de y estaría en diferentes direcciones de memoria.

A continuación, modificamos x:

>>> x = 6
>>> id(x)
137396080

Se ha creado un nuevo objeto, de valor 6, y ahora x apunta a ese valor. Esto también es muy diferente a lo que sucedería en otros lenguajes: la variable x seguiría en la misma dirección de memoria, habiendo modificado únicamente su contenido.

Fijémonos que, como es de esperar, y sigue apuntando al objeto primero:

>>> id(y)
137396064
>>> y
5

Analicemos ahora qué sucede en el caso de las listas:

>>> x = [1, 2, 3, 4]
>>> y = x
>>> id(x)
170964396
>>> id(y)
170964396

De momento, todo es exactamente igual que antes: se ha creado un único objeto, la lista [1, 2, 3, 4], que está referenciado por dos variables, x e y.

Si ahora modificamos directamente el objeto (al ser mutable, podemos hacerlo):

>>> x[0] = 5
>>> id(x)
170964396
>>> id(y)
170964396

comprobamos que tanto x como y siguen siendo referencias al mismo objeto.

Por lo tanto y tiene el mismo valor que x:

>>> y
[5, 2, 3, 4]

En el ejemplo anterior, cuando hicimos x = 6, se creó un nuevo objeto. En el caso de la lista, hemos modificado in situ el propio objeto, aprovechándonos de su mutabilidad. Es como si un cirujano hubiese realizado una operación sobre el objeto.

La situación habría sido muy distinta si hubiéramos hecho esto otro:

>>> x = [1, 2, 3, 4]
>>> y = x
>>> x = [5, 2, 3, 4]
>>> y
[1, 2, 3, 4]
>>> id(x)
170489580
>>> id(y)
170791756

Fíjate en la importante diferencia: al hacer x = [5, 2, 3, 4] hemos creado un objeto diferente, de modo que x e y apuntan a objetos distintos y por eso ahora sus valores difieren. En el caso anterior, al hacer x[0] = 5 modificamos directamente el mismo objeto y no se creó otro nuevo.

Espero que todo resulte más claro ahora y entiendas la diferencia esencial que hay en lo que respecta al concepto de variable respecto a otros lenguajes de programación. Si es así, felicítate, pues habrás cambiado de nivel en tu proceso de aprendizaje de Python.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/09/python-el-sagrado-misterio-de-la-inmutabilidad/


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

Construcción de acordes: Tabla de referencia

Vamos a dedicar un artículo especial a resumir todas las fórmulas presentadas en la serie Construcción de acordes. Aún quedan, desde luego, muchos por tratar, así que estamos ante un artículo dinámico que iré actualizando conforme vaya explicando nuevos tipos de acordes.

La finalidad de esta serie es saber calcular las notas que constituyen cualquier tipo de acorde sobre cualquier fundamental. No explica cómo hay que poner los dedos sobre la guitarra para montarlos (algo que se abordará en otra serie), aunque su deducción será sencilla una vez conozcamos las notas concretas. Todo músico debería poseer esa habilidad (podemos perdonar a los percusionistas, aunque también es recomendable para ellos).

En el primer artículo se explica la metodología empleada para el cálculo de las notas, basada en la fórmula de cada acorde en relación a la escala mayor.

En la Tabla de Referencia que figura a continuación, junto al nombre del acorde se indica su fórmula, un ejemplo partiendo de Do como nota fundamental y su cifrado más común. Haciendo clic sobre el nombre se cargará la página en la que fue presentado.

Acorde Fórmula Ejemplo en DO Cifrado típico
Acorde de quinta / Power Chord 1 – 5 C – G C5
Mayor 1 – 3 – 5 C – E – G C
Menor 1 – b3 – 5 C – Eb – G Cm, Cmin, C-
Aumentado 1 – 3 – #5 C – E – G# C+, Caug
Disminuido 1 – b3 – b5 C – Eb – Gb Cdim, C°
Cuarta suspendida 1 – 4 – 5 C – F – G Csus4
Segunda suspendida 1 – 2 – 5 C – D – G Csus2
Séptima 1 – 3 – 5 – b7 C – E – G – Bb C7
Séptima mayor 1 – 3 – 5 – 7 C – E – G – B C7M, Cmaj7, CΔ
Sexta 1 – 3 – 5 – 6 C – E – G – A C6
Menor sexta 1 – b3 – 5 – 6 C – Eb – G – A Cm6
Menor séptima 1 – b3 – 5 – b7 C – Eb – G – Bb Cm7
Menor séptima quinta bemol (semidisminuido) 1 – b3 – b5 – b7 C – Eb – Gb – Bb Cm7(b5), C∅
Séptima disminuido 1 – b3 – b5 – 6 C – Eb – Gb – A Cdim7, C°, C°7
Novena añadida 1 – 3 – 5 – 9 C – E – G – D Cadd9
Menor con séptima mayor 1 – b3 – 5 – 7 C – Eb – G – B Cm(7M)
Séptima mayor con quinta aumentada 1 – 3 – 5# – 7 C – E – G# – B C7M(#5), C+(7M), Caug(7M)
Séptima con quinta aumentada 1 – 3 – 5# – b7 C – E – G# – Bb C7(#5), C+7, Caug7, C7(+5)
Séptima con quinta disminuida 1 – 3 – b5 – b7 C – E – Gb – Bb C7(b5)
Séptima mayor con novena 1 – 3 – 5 – 7 – 9 C – E – G – B – D C7M(9), Cmaj7(9), Cmaj9, C9M
Séptima con novena 1 – 3 – 5 – b7 – 9 C – E – G – Bb – D C7(9), C9
Menor séptima con novena 1 – b3 – 5 – b7 – 9 C – Eb – G – Bb – D Cm7(9), Cm9
Séptima con novena aumentada 1 – 3 – 5 – b7 – #9 C – E – G – Bb – D# C7(#9)
Séptima con novena menor 1 – 3 – 5 – b7 – b9 C – E – G – Bb – Db C7(b9)
Sexta con novena 1 – 3 – 5 – 6 – 9 C – E – G – A – D C6/9, C6(9), C6add9
Séptima mayor con novena y oncena 1 – 3 – 5 – 7 – 9 – 11 C – E – G – B – D – F Cmaj7(9)(11), Cmaj11
Séptima mayor con novena y oncena aumentada 1 – 3 – 5 – 7 – 9 – #11 C – E – G – B – D – F# Cmaj7(9)(#11)
Menor séptima con novena y oncena 1 – b3 – 5 – b7 – 9 – 11 C – Eb – G – Bb – D – F Cm7(9)(11), Cm11
Séptima con novena y oncena / Oncena de dominante 1 – 3 – 5 – b7 – 9 – 11 C – E – G – Bb – D – F C11, C7(9)(11)

Recuerda: no pierdas de vista esta tabla, pues irá creciendo a medida que un nuevo acorde sea presentado en la serie.

Javier Montero Gabarró


Fecha de última revisión: 10 de agosto de 2014


Construcción de acordes: Tabla de referencia


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta

Intervalos sin secretos: Tabla de Referencia y el Modelo del Muelle

En los dos artículos anteriores (primera parte y segunda parte) expliqué la teoría subyacente a la denominación de intervalos musicales. De cara a la resolución de los ejercicios prácticos, es conveniente reorganizar toda esta información agrupando los intervalos por la distancia entre sus grados (primera, segunda, tercera…).

Concluiremos con lo que denomino el modelo del muelle, que nos ayudará a afianzar todos estos conceptos con facilidad.

Tabla de referencia de intervalos

Primera
Justa o Perfecta: 0 semitonos
Aumentada: 1 semitono

Segunda
Disminuida: 0 semitonos
Menor: 1 semitono
Mayor: 2 semitonos
Aumentada: 3 semitonos

Tercera
Disminuida: 2 semitonos
Menor: 3 semitonos
Mayor: 4 semitonos
Aumentada: 5 semitonos

Cuarta
Disminuida: 4 semitonos
Justa o Perfecta: 5 semitonos
Aumentada: 6 semitonos

Quinta:
Disminuida: 6 semitonos
Justa o Perfecta: 7 semitonos
Aumentada: 8 semitonos

Sexta:
Disminuida: 7 semitonos
Menor: 8 semitonos
Mayor: 9 semitonos
Aumentada: 10 semitonos

Séptima:
Disminuida: 9 semitonos
Menor: 10 semitonos
Mayor: 11 semitonos
Aumentada: 12 semitonos

Octava:
Disminuida: 11 semitonos
Justa o Perfecta: 12 semitonos
Aumentada: 13 semitonos

Con esta sencilla tabla nos será muy sencillo resolver los ejercicios prácticos: comenzamos determinando la distancia entre las notas naturales para saber si se trata de una tercera, cuarta, etc., y contamos después el total de semitonos para aplicar la cualidad correspondiente.

El modelo del muelle

Visualiza un muelle normal. Puedes realizar dos tipos de acciones con él: estirarlo o comprimirlo.

Recuerda los intervalos que aparecían en la escala mayor desde la tónica hasta el resto: eran todos o bien justos o bien mayores. Tan sólo dos tipos.

Esos dos tipos de intervalos, justos y mayores, pueden ser representados por dos muelles. El hecho de estirar el muelle tendría el efecto de agregarle un semitono al intervalo; comprimirlo le restaría uno.

Comencemos por los muelles justos: si los estiramos los convertimos en aumentados; si los comprimimos en disminuidos.

Cojamos ahora el muelle mayor: si lo estiramos lo convertimos en aumentado, pero si lo comprimimos se convierte en menor. Esto nos permite tener la posibilidad de seguir comprimiéndolo todavía más: si lo aprieto un poco más (es decir, le quito otro semitono) se convierte ya en disminuido.

Los intervalos son como esos muelles: aumentar un semitono un intervalo justo o mayor los convierte en intervalos aumentados. Restar un semitono a un intervalo justo lo transforma en disminuido. Restar un semitono a un intervalo mayor lo hace menor y si a este, a su vez, le quitamos otro semitono lo convertimos finalmente en disminuido.

De este modo, no te hará falta memorizar la tabla entera. Por ejemplo, si te aprendes que una quinta justa son siete semitonos, sin necesidad de memorizar más sabrás ya que la quinta aumentada son ocho y la disminuida seis. Si sabes que una séptima mayor son once semitonos, tienes inmediatamente que la aumentada son doce, la menor diez y la disminuida nueve.

Javier Montero Gabarró


Intervalos sin secretos: Tabla de Referencia y el Modelo del Muelle


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies