Download Clase práctica 4 (Listas y Aliasing)

Document related concepts
no text concepts found
Transcript
Introducción a la Computación
Listas y Aliasing
Maximiliano Geier
6/04/2016
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
1/9
Introducción
Clase de hoy
Hoy vamos a ver algunos ejemplos de cómo se usan listas en Python.
Las listas son tipos de contenedores.
En Python tenemos dos tipos de contenedores: mutables e inmutables.
Un problema a tratar con los contenedores mutables es el aliasing.
Finalmente: copy y deepcopy.
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
2/9
Listas
Listas en Python
La forma de construir listas en Python es utilizando [].
Lista vacı́a a = []
Con valores a = [1,2,3,4]
Longitud len(a)
n-ésimo a[n]
Concatenar a = a + b
Insertar
a.append(valor) # insertar al final
a.insert(0, valor) # insertar al principio
a += [valor] # concatenar con la lista [valor]
Asignación a[n] = valor
Numeración: los elementos en una lista se cuentan a partir del 0.
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
3/9
Listas
Ejercicios
1
Escribir en Python una función llamada listaCeros(n), que
devuelva una lista con n veces el número 0.
2
Especificar el problema anterior.
3
Escribir en Python una función llamada matrizCeros(n), que
devuelva una matriz cuadrada (lista de listas) de n × n ceros.
4
Escribir en Python una función llamada matrizIdentidad(n), que
devuelva la matriz identidad de n × n.
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
4/9
Aliasing
Aliasing
Problema: al cambiar un elemento de la matriz, se cambia también la
misma columna en todas las filas.
Una lista tiene referencias a cada uno de los elementos.
Una referencia es una asociación con una posición de memoria.
Al agregar elementos con res.append(fila), estamos agregando
siempre la misma referencia (a fila).
Al mutar un elemento de la lista, se modifican todos los elementos
cuya referencia en memoria sea la misma.
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
5/9
Aliasing
Solución
problema listaCeros(n : Z) = [res : Z]{
requiere : n ≥ 0;
asegura : |res| = n ∧ (∀i : Z)(0 ≤ i < n → res[i] = 0);
}
def listaCeros(n):
res = []
i = 0
while i < n:
res.append(0)
i += 1
return res
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
6/9
Aliasing
Solución
def matrizCeros(n):
res = []
i = 0
while i < n:
res.append(listaCeros(n))
i += 1
return res
def matrizCerosAliasing(n):
res = []
fila = listaCeros(n)
i = 0
while i < n:
res.append(fila)
i += 1
return res
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
7/9
Aliasing
Solución
def matrizIdentidad(n):
res = matrizCeros(n)
i = 0
while i < n:
res[i][i] = 1
i += 1
return res
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
8/9
Copy y deepcopy
Shallow copy y deep copy
Shallow copy A shallow copy constructs a new compound object and then
(to the extent possible) inserts references into it to the
objects found in the original.
Deep copy A deep copy constructs a new compound object and then,
recursively, inserts copies into it of the objects found in the
original.
En código:
from copy import copy, deepcopy
a = matrizIdentidad(4)
b = copy(a) # shallow copy
c = deepcopy(a) # deep copy
Para visualizar código: http://pythontutor.com/visualize.html
Maximiliano Geier
Clase Práctica 04: Listas y Aliasing
6/04/2016
9/9