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