y = x
hacemos el que el identificador de y
sea el mismo que el de x
, ambas apuntan a la misma dirección de memoria.id
de ambas y vemos que ahora es diferente.x = 1
y = 2
print(id(x)) # Output: 140040150450416
print(id(y)) # Output: 140040150450448
y = x # realizamos una copia de una variable en otra
print(id(x)) # Output: 140040150450416
print(id(y)) # Output: 140040150450416
x = 100 # reasignamos el valor de x
print(x) # Output: 100
print(y) # Output: 1
print(id(x)) # Output: 140040150453584
print(id(y)) # Output: 140040150450416
134714609271024 134714609271056 134714609271024 134714609271024 100 1 134714609274192 134714609271024
id
no cambia¶y = x
y = copy(x)
y = list(x)
x = [1, 2, 3]
y = x # COPIA SUPERFICIAL
print(id(x)) # Output: 140039729902208
print(id(y)) # Output: 140039729902208
x[0] = 100 # reasignación del valor del un elemento del array
print(x) # Output: [100, 2, 3]
print(y) # Output: [100, 2, 3] tambien cambia el valor
print(id(x)) # Output: 140039729902208
print(id(y)) # Output: 140039729902208
134714180775680 134714180775680 [100, 2, 3] [100, 2, 3] 134714180775680 134714180775680
from copy import copy
x = [1, 2, 3]
y = copy(x) # COPIA PROFUNDA
print(id(x)) # Output: 140039743881408
print(id(y)) # Output: 140039692347264
x[0] = 100 # reasignación del valor del un elemento del array
print(x) # Output: [100, 2, 3]
print(y) # Output: [1, 2, 3] no se altera el valor, es independiente
print(id(x)) # Output: 140039743881408
print(id(y)) # Output: 140039692347264
134714184138944 134714180957120 [100, 2, 3] [1, 2, 3] 134714184138944 134714180957120
id
cambia¶Si se reasigna completamente la lista igualando al variable a otra lista diferente vemos que el id
cambia ya que se trata de una nueva lista y ya no está vinculada a la anteriro, no ocupan el mismo espacio en memoria.
x = [1, 2, 3]
y = x # COPIA SUPERFICIAL
print(id(x)) # Output: 140039692436224
print(id(y)) # Output: 140039692436224
x = [100, 200, 200] # reasignamos completamente el valor de la lista
print(x) # Output: [100, 200, 200]
print(y) # Output: [1, 2, 3]
print(id(x)) # Output: 140038894863616
print(id(y)) # Output: 140039692436224
134714180766464 134714180766464 [100, 200, 200] [1, 2, 3] 134714184138944 134714180766464
Otro motivo por el que una lista con copia superficial se comporta de forma similar a un puntero lo podemos ver en el alcance de las variables locales dentro de un función.
lista = [1,2,3]
print(f"La lista externa es {lista}\n")
def modifica(lista):
lista[0] = 100
print(f"La lista interna es {lista}")
print("Ejecutamos la función que modifica la lista\n")
modifica(lista)
print(f"La lista externa es {lista}")
La lista externa es [1, 2, 3] Ejecutamos la función que modifica la lista La lista interna es [100, 2, 3] La lista externa es [100, 2, 3]