Скачать книгу

bien podemos asignar a la variable de entorno PYTHONDONTWRITEBYTECODE el valor true:

image

      o bien podemos hacerlo cuando el programa se está ejecutando, escribiendo sys.dont_write_bytecode = True:

image

      A menudo se dice que todo en Python son objetos. En realidad, como ya hemos dicho en más de una ocasión, los objetos no forman parte del código, sino que este los genera cuando el programa se está ejecutando. En esta sección daremos una definición formal de objeto, recogiendo cuanto hemos sembrado en la primera parte del libro. Además veremos con mayor profundidad cuál es el vínculo entre objetos y etiquetas, puesto que podría no ser evidente de inmediato para aquellos que solo tienen experiencia en programación con lenguajes de tipificación estática.

      Definición de objeto

      Los objetos en Python son estructuras de datos generadas por el código en ejecución, a las cuales este se refiere. Precisamente, son las expresiones que generan o hacen referencia a los objetos.

      Hasta que no se utilizan, los objetos se mantienen en la memoria del ordenador para que puedan ser llamados cuando sean necesarios; sin embargo, en el momento en que no hay ninguna etiqueta que hace referencia a ellos, un mecanismo singular, denominado recolector de basura (garbage collection), procede a liberar la memoria que ocupaban.

      NOTA

      Podemos gestionar el mecanismo del recolector de basura utilizando el módulo gc, que proporciona una interfaz para el mismo: http://docs.python.org/3/library/gc.html.

      Los objetos tienen un tipo y una identidad. Podemos obtener el tipo de un objeto tanto mediante la clase integrada type como mediante el atributo _ _class_ _ del objeto:

image

      La identidad del objeto, que en Python corresponde a su dirección en la memoria, es devuelta por la función integrada id():

image

      Además, observamos que dos objetos diferentes tienen identidades distintas incluso teniendo el mismo valor:

image

      NOTA

      Cuando el intérprete encuentra los literales de los tipos mutables, por cuestiones de optimización (independientemente de la implementación), prefiere la reutilización de objetos ya existentes a la creación de otros nuevos, especialmente si se trata de objetos que ocupan poco espacio en memoria:

image

      Cabe señalar que, el hecho de que cada estructura de datos generada por el código Python en ejecución sea un objeto, no significa que el único paradigma de programación soportado sea el de objetos. Como hemos dicho en la sección El estado del arte, Python es un lenguaje multiparadigma.

      El vínculo entre las etiquetas y los objetos

      Como ya sabemos, en Python no existen las declaraciones, y el tipo de los objetos es establecido cuando el programa se ejecuta. Quizás ahora nos preguntemos cuál es el papel de las etiquetas, puesto que podemos asignar objetos de distintos tipos a la misma etiqueta:

image

      La idea es que una etiqueta es simplemente un identificador mediante el cual se hace referencia al objeto. Esto significa que la primera asignación vincula la etiqueta var al objeto que representa el número 44, de tipo int, como se muestra en la Figura 1.1.

image

      Figura 1.1 - Asignación de la etiqueta var a un número entero de valor 44.

      La segunda asignación vincula var a un nuevo objeto, que representa el número 99 y también de tipo int, y ya no existe ninguna vinculación entre var y el objeto que representa el número 44. Además, este último no tiene ninguna etiqueta que haga referencia a aquel, por lo que no puede ser utilizado de ningún modo; Python, por tanto, libera la memoria que ocupaba, como se muestra en la Figura 1.2.

image

      Figura 1.2 - Asignación de la etiqueta var a un nuevo número entero, de valor 99. El 44 deja la memoria libre.

      Por último, la tercera asignación vincula var al objeto que representa la cadena 'python', como se muestra en la Figura 1.3.

image

      Figura 1.3 - Asignación de un nuevo objeto de tipo str a la etiqueta var.

      Para agilizar la exposición, de ahora en adelante en este libro no volveremos a hablar de objeto que representa a un número o una cadena, sino que diremos simplemente objeto de tipo int, objeto de tipo str, etc. Además, utilizaremos el término referencia para indicar el vínculo entre la etiqueta y el objeto:

image

      Una etiqueta puede ser utilizada solo tras haber sido asignada a un objeto:

image

      NOTA

      Como podemos observar en este ejemplo, el término utilizado por el intérprete para indicar lo que nosotros hemos denominado "etiqueta" es name. Gran parte de los libros y de la documentación en inglés también utiliza este término.

      Una operación de asignación a una etiqueta ya existente no modifica nunca el objeto que le ha sido asignado:

image

      Esto no siempre es cierto, incluso si el objeto es mutable. Consideremos, por ejemplo, la siguiente lista:

image

      que representamos en la Figura 1.4.

image

      Figura 1.4 - Representación de la referencia entre la etiqueta var y la lista [1, 2, 3].

      Si realizamos la asignación var = [1, 2, 3] + [4], aunque la lista sea mutable, el objeto con el identificador 3073876076 no se modifica. Esta instrucción solo tiene como efecto crear un nuevo objeto de tipo lista y asignarlo a la etiqueta `var`:

image

      La lista anterior ya no sirve porque ya no existen más etiquetas que hagan referencia a ella, por lo que Python libera la memoria ocupada, como mostramos de forma esquemática en la Figura 1.5.

image

      Figura 1.5 - La etiqueta var se refiere a la lista [1, 2, 3, 4]. La lista [1, 2, 3] libera la memoria.

      El efecto explícito de la asignación es, por tanto, siempre y solo crear un vínculo entre la etiqueta y el objeto a la derecha del signo igual.

Скачать книгу