Paso de Python por referencias

Hola, estoy tratando de entender cómo funciona el paso por referencia de Python. Tengo un ejemplo

>>>a = 1 >>>b = 1 >>>id(a);id(b) 140522779858088 140522779858088 

Esto tiene mucho sentido ya que a y b hacen referencia al mismo valor que tendrían la identidad. Lo que no entiendo es cómo este ejemplo:

 >>>a = 4.4 >>>b = 1.0+3.4 >>>id(a);id(b) 140522778796184 140522778796136 

Es diferente de este ejemplo:

 >>>a = 2 >>>b = 2 + 0 >>>id(a);id(b) 140522779858064 140522779858064 

¿Es porque en el tercer ejemplo, el intérprete ve el objeto 0 int como “Ninguno” y no se reconoce que necesite una identidad diferente del objeto al que la variable “a” hace referencia (2)? Mientras que en el segundo ejemplo, “b” está agregando dos objetos int diferentes y el intérprete está asignando memoria para que se agreguen ambos objetos, lo que da a la variable “a”, una identidad diferente de la variable “b”?

En su primer ejemplo, los nombres a y b son ambos “referenciando” al mismo objeto debido a la internación . La instrucción de asignación dio como resultado un número entero con el mismo id solo porque ha reutilizado un objeto preexistente que ya se encontraba en la memoria. Eso no es un comportamiento confiable de enteros:

 >>> a = 257 >>> b = 257 >>> id(a), id(b) (30610608, 30610728) 

Como se demostró anteriormente, si escoge un número entero lo suficientemente grande, entonces se comportará como se comportan los flotantes en su segundo ejemplo. Y la internación de pequeños enteros es opcional en el lenguaje Python, de todos modos, este es un detalle de implementación de CPython: es una optimización del rendimiento para evitar la sobrecarga de crear un nuevo objeto. Podemos acelerar las cosas almacenando en caché las instancias de enteros comúnmente utilizadas, a costa de una mayor huella de memoria del intérprete de Python.

No piense en “referencia” y “valor” al tratar con Python, el modelo que funciona para C realmente no funciona bien aquí. En su lugar, piense en “nombres” y “objetos”.

nombres

El diagtwig de arriba ilustra tu tercer ejemplo. 2 es un objeto, b son nombres. Podemos tener diferentes nombres que apuntan al mismo objeto. Y los objetos pueden existir sin ningún nombre.

Asignar una variable solo adjunta una etiqueta de nombre . Y eliminar una variable solo elimina una etiqueta de nombre . Si tienes esta idea en mente, el modelo de objetos de Python nunca más te sorprenderá.