Sé que la "asignación de variables" en python es, de hecho, un enlace / reenlace de un nombre (la variable) a un objeto.

b = [1,2,3]
a = b[2] # binding a to b[2] ?
a = 1000

B es [1, 2, 3]

Después de este cambio, ¿por qué b no se cambia?

Aquí hay otro ejemplo:

b = [1,2,3]
a = b
a[0] = 1000

Este caso b es [1000, 2, 3]

¿no es la asignación en el enlace de referencia de Python?

Gracias

2
echo Lee 9 oct. 2019 a las 01:34

3 respuestas

La mejor respuesta
a = b[2] # binding a to b[2] ?

Específicamente, esto une el nombre a al mismo valor al que hace referencia b[2]. No une a al elemento en la lista b en el índice 2. El nombre a es completamente independiente de la lista de donde obtuvo su valor.

a = 1000

Ahora vincula el nombre a a un nuevo valor, el entero 1000. Como a no tiene asociación con b, b no cambia.

En tu segundo ejemplo:

a = b

Ahora a está vinculado al mismo valor de lista al que b está vinculado. Entonces cuando lo haces

a[0] = 1000

Modifica un elemento en la lista subyacente que tiene dos nombres diferentes. Cuando acceda a la lista por cualquier nombre, verá el mismo valor.

1
Code-Apprentice 8 oct. 2019 a las 22:38

Las listas son objetos mutables, los ints no lo son. 4 no puede convertirse en 5 en python, pero una lista puede cambiar su contenido.

-1
LtWorf 8 oct. 2019 a las 22:36

a[0] = ... es una forma especial de asignación que se desugará a una llamada al método,

a.__setattr__(0, ...)

No está reasignando el nombre a; está asignando un "espacio" en el objeto al que se hace referencia por a (y b).

1
chepner 8 oct. 2019 a las 22:39
58294846