Traté de usar la asignación múltiple como se muestra a continuación para inicializar las variables, pero el comportamiento me confundió, espero reasignar la lista de valores por separado, quiero decir que b [0] yc [0] son 0 como antes.
a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)
El resultado es: [1, 3, 5] [1, 3, 5] [1, 3, 5]
¿Es eso correcto? ¿Qué debo usar para la asignación múltiple? ¿Qué es diferente de esto?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
resultado: ('f:', 3) ('e:', 4)
a
,b
yc,
a todos los puntos con el mismo valor (en este caso una lista), o quierea=0
,b=3
yc=5
. En ese caso, quieresa,b,c = [0,3,5]
o simplementea,b,c = 0,3,5
.Respuestas:
Si vienes a Python desde un lenguaje en C / Java / etc. familia, puede ayudarlo a dejar de pensar en
a
una "variable" y comenzar a pensar en ella como un "nombre".a
,b
yc
no son variables diferentes con valores iguales; son nombres diferentes para el mismo valor idéntico. Las variables tienen tipos, identidades, direcciones y todo tipo de cosas como esa.Los nombres no tienen nada de eso. Los valores sí, por supuesto, y puede tener muchos nombres para el mismo valor.
Si le das
Notorious B.I.G.
un hot dog, *Biggie Smalls
yChris Wallace
tienes un hot dog. Si cambia el primer elemento dea
a 1, los primeros elementos deb
yc
son 1.Si desea saber si dos nombres están nombrando el mismo objeto, use el
is
operador:Luego preguntas:
Aquí, vuelve a vincular el nombre
e
al valor4
. Eso no afecta los nombresd
yf
de ninguna manera.En su versión anterior, estaba asignando a
a[0]
, no aa
. Entonces, desde el punto de vista dea[0]
, estás volviendo a vinculara[0]
, pero desde el punto de vista dea
, lo estás cambiando en el lugar.Puede usar la
id
función, que le proporciona un número único que representa la identidad de un objeto, para ver exactamente qué objeto es cuál, incluso cuandois
no puede ayudar:Observe que
a[0]
ha cambiado de 4297261120 a 4297261216; ahora es un nombre para un valor diferente. Yb[0]
ahora también es un nombre para ese mismo nuevo valor. Eso es porquea
yb
todavía están nombrando el mismo objeto.Debajo de las cubiertas, en
a[0]=1
realidad está llamando a un método en el objeto de la lista. (Es equivalente aa.__setitem__(0, 1)
). Entonces, en realidad no está volviendo a unir nada. Es como llamarmy_object.set_something(1)
. Claro, es probable que el objeto vuelva a vincular un atributo de instancia para implementar este método, pero eso no es lo importante; lo importante es que no estás asignando nada, solo estás mutando el objeto. Y es lo mismo cona[0]=1
.user570826 preguntó:
Esa es exactamente la misma situación que
a = b = c = [1, 2, 3]
: tiene tres nombres para el mismo valor.Pero en este caso, el valor es an
int
, yint
s son inmutables. En cualquiera de los casos, se puede volver a enlazara
a un valor diferente (por ejemplo,a = "Now I'm a string!"
), pero el no va a afectar al valor original, el cualb
, yc
seguirá siendo nombres para. La diferencia es que con una lista, puede cambiar el valor[1, 2, 3]
en[1, 2, 3, 4]
la marcha, por ejemplo,a.append(4)
; ya que es en realidad el cambio del valor queb
yc
son nombres para,b
ahora quieren b[1, 2, 3, 4]
. No hay forma de cambiar el valor10
en otra cosa.10
tiene 10 años para siempre, al igual que Claudia el vampiro tiene 5 para siempre (al menos hasta que sea reemplazada por Kirsten Dunst).* Advertencia: no le dé a Notorious BIG un hot dog. Los zombis del rap gangsta nunca deberían ser alimentados después de la medianoche.
fuente
have, a = b = c = 10;
sucede si nosotros y cuando intentamos actualizar el valor de b, afecta a cualquier otro? aunque verifiqué que sus identificadores son los mismos.10
es inmutable; eso significa que no hay forma de actualizar el valor, por lo que su pregunta no tiene sentido. Puede apuntarb
a un valor diferente, pero hacerlo no tiene efecto ena
yc
, que todavía apuntan al valor original. La diferencia que marcan las listas es que son mutables, por ejemplo, puedeappend
en una lista, olst[0] = 3
, y eso actualizará el valor, que será visible a través de todos los nombres para ese valor.Tos tos
fuente
a,b,c = 1,2,3
sin corchetes funciona en Python 2 o 3, si realmente quieres ese cm extra de legibilidad.Sí, ese es el comportamiento esperado. a, byc se establecen como etiquetas para la misma lista. Si desea tres listas diferentes, debe asignarlas individualmente. Puede repetir la lista explícita o utilizar una de las numerosas formas de copiar una lista:
Las declaraciones de asignación en Python no copian objetos: vinculan el nombre a un objeto, y un objeto puede tener tantas etiquetas como usted establezca. En su primera edición, cambiando a [0], está actualizando un elemento de la lista única a la que se refieren a, byc. En su segundo, cambiando e, está cambiando e para que sea una etiqueta para un objeto diferente (4 en lugar de 3).
fuente
En python, todo es un objeto, también tipos de variables "simples" (int, float, etc.).
Cuando cambia un valor de variable, en realidad cambia su puntero , y si compara entre dos variables, compara sus punteros . (Para ser claros, el puntero es la dirección en la memoria física de la computadora donde se almacena una variable).
Como resultado, cuando cambia un valor de variable interna, cambia su valor en la memoria y afecta a todas las variables que apuntan a esta dirección.
Por ejemplo, cuando haces:
Esto significa que ayb apunta a la misma dirección en la memoria que contiene el valor 5, pero cuando lo hace:
No afecta a b porque a ahora apunta a otra ubicación de memoria que contiene 6 yb todavía apunta a la dirección de memoria que contiene 5.
Pero cuando lo haces:
ayb, nuevamente, apunta a la misma ubicación pero la diferencia es que si cambia uno de los valores de la lista:
Cambia el valor de la memoria en la que a apunta, pero a todavía apunta a la misma dirección que b, y como resultado, b también cambia.
fuente
PyObject
. Eso no es cierto en otras implementaciones como PyPy o Jython. (De hecho, ni siquiera es claro cómo podría ser cierto, porque las lenguas esas implementaciones están escritas en ni siquiera tienen punteros.)Puede usar
id(name)
para verificar si dos nombres representan el mismo objeto:Las listas son mutables; significa que puede cambiar el valor en su lugar sin crear un nuevo objeto. Sin embargo, depende de cómo cambie el valor:
Si asigna una nueva lista para
a
, a continuación, su identificador va a cambiar, por lo que no afectaráb
yc
's valores:Los enteros son inmutables, por lo que no puede cambiar el valor sin crear un nuevo objeto:
fuente
id
No es necesariamente una ubicación de memoria. Como dicen los documentos , esto devuelve la "identidad ... un número entero ... que se garantiza que es único y constante para este objeto durante su vida útil". CPython utiliza la dirección de memoria comoid
, pero otras implementaciones de Python pueden no hacerlo. PyPy, por ejemplo, no. Y decir "dos vars apuntan a la misma ubicación de memoria" es engañoso para cualquiera que lo entienda al estilo C. "Dos nombres para el mismo objeto" es más preciso y menos engañoso.en tu primer ejemplo
a = b = c = [1, 2, 3]
realmente estás diciendo:Si desea establecer 'a' igual a 1, 'b' igual a '2' y 'c' igual a 3, intente esto:
¡Espero que esto ayude!
fuente
En pocas palabras, en el primer caso, está asignando múltiples nombres a a
list
. Solo se crea una copia de la lista en la memoria y todos los nombres se refieren a esa ubicación. Por lo tanto, cambiar la lista usando cualquiera de los nombres en realidad modificará la lista en la memoria.En el segundo caso, se crean múltiples copias del mismo valor en la memoria. Entonces cada copia es independiente la una de la otra.
fuente
Lo que necesitas es esto:
fuente
El código que hace lo que necesito podría ser este:
Resultado:
fuente