Precedencia del operador de asignación de Python – (a, b) = a = {}, 5

Vi este fragmento de Python en Twitter y quedé bastante confundido por la salida:

>>> a, b = a[b] = {}, 5 >>> a {5: ({...}, 5)} 

¿Que esta pasando aqui?

De la documentación de las declaraciones de asignación :

Una statement de asignación evalúa la lista de expresiones (recuerde que esto puede ser una expresión única o una lista separada por comas; esta última produce una tupla) y asigna el único objeto resultante a cada una de las listas de destino, de izquierda a derecha.

Tienes dos listas de objectives de asignación; a, b y a[b] , el valor {}, 5 se asigna a esos dos objectives de izquierda a derecha.

Primero {}, 5 se desempaqueta la tupla {}, 5 a a, b . Ahora tienes a = {} y b = 5 . Tenga en cuenta que {} es mutable.

A continuación, asigne el mismo diccionario y entero a a[b] , donde a evalúa al diccionario b evalúa a 5 , por lo que está configurando la clave 5 en el diccionario a la tupla ({}, 5) creando una referencia circular . El {...} tanto se refiere al mismo objeto al que ya se está haciendo referencia.

Debido a que la asignación se lleva a cabo de izquierda a derecha, puede dividirla en:

 a, b = {}, 5 a[b] = a, b 

entonces a[b][0] es el mismo objeto que a :

 >>> a, b = {}, 5 >>> a[b] = a, b >>> a {5: ({...}, 5)} >>> a[b][0] is a True