¿Cómo funciona esta asignación de cadena?

Considere el siguiente código; Es una mala práctica de progtwigción. Me pregunto por qué la lista A resultante es [1, 1, 3] lugar de [1, 2, 1] . Desde la vista de Java, el resultado debe ser [1, 2, 1] . ¿Alguien puede explicar por qué este resultado es lo que es?

 A = [1, 2, 3] t = 2 t = A[t] = A.count(3) 

Después de la evaluación, A es [1, 1, 3] yt es 1 .

Mi versión de Python es 3.3.

En la línea 3 tienes una tarea encadenada.

 t = A[t] = A.count(3) 

t = A.count(3) se evalúa primero – t establece en el valor de retorno de A.count(3) que en este caso es 1. Luego, el miembro de A en el índice t (= 1) se establece en el valor de retorno de A.count(3) , que sigue siendo 1.

Lea más sobre asignaciones encadenadas en Python aquí

A.count(3) produce 1 .

t = 1 se ejecuta primero. Ahora t es 1 .

A[t] = 1 se ejecuta. ( A[1] = 1 )


 >>> class Demo: ... def __setitem__(self, idx, value): ... print 'Set index', idx ... >>> d = Demo() >>> d[1] = d[2] = 2 Set index 1 Set index 2 

Jaja … La evaluación de Python de dicha expresión no es tan obvia como se puede esperar de la expresión t = A[t] = A.count(3) . En el primer paso el valor al final se evalúa con 1 . Luego se asigna primero a t y luego a A[t] , pero en este momento t es 1.

La sugerencia de @Henrik para leer sobre tareas encadenadas es muy buena.

En realidad, su ejemplo explica por sí mismo por qué se percibe como una mala práctica de progtwigción .