Este artículo explora un comportamiento sutil pero común en Python relacionado con la asignación encadenada (chained assignment), y cómo se manifiesta a nivel de bytecode. La asignación encadenada, como en a = b = [], puede llevar a errores inesperados porque Python crea un solo objeto de lista y lo asigna a ambas variables. Esto significa que cualquier modificación a la lista a través de una variable (por ejemplo, a.append(1)) afectará a la otra variable (b), incluso si la intención era crear listas independientes. El autor descubrió este comportamiento mientras depuraba un error y decidió investigar qué ocurría a nivel de bytecode utilizando el módulo dis de Python, que permite inspeccionar el código desensamblado de CPython.
El análisis del bytecode revela que la asignación encadenada se traduce en una única instrucción BUILD_LIST seguida de una instrucción COPY para duplicar la referencia a la lista recién creada, y luego dos instrucciones STORE_FAST para asignar la referencia a las variables a y b. Esto confirma que ambas variables apuntan al mismo objeto en memoria. En contraste, la asignación regular (a = [], b = []) genera dos instrucciones BUILD_LIST separadas, creando dos objetos de lista distintos.
El artículo proporciona ejemplos concretos de código y la salida del dis module para ilustrar la diferencia entre la asignación encadenada y la asignación regular. Entender esta diferencia es crucial para evitar errores sutiles y difíciles de depurar. El uso de dis permite a los desarrolladores comprender mejor el funcionamiento interno de Python y optimizar su código. El artículo concluye que, aunque la asignación encadenada puede ser concisa, es importante ser consciente de sus implicaciones y, en muchos casos, optar por la asignación regular para mayor claridad y seguridad.
Para quienes trabajan con Python, especialmente en proyectos complejos, comprender el bytecode y cómo se traduce el código fuente puede ser una herramienta valiosa para la depuración y optimización. El artículo también sugiere explorar otros recursos, como videos que profundizan en el uso del módulo dis para inspeccionar el código de funciones más complejas.
