Foros del Web » Programando para Internet » Python »

Duda simple de asignación

Estas en el tema de Duda simple de asignación en el foro de Python en Foros del Web. Buenas, hace unos dias acabo de empezar a estudiar python, pero no me queda claro con un tema de la asignacion, me explico. En este ...
  #1 (permalink)  
Antiguo 01/06/2011, 10:08
 
Fecha de Ingreso: junio-2009
Mensajes: 84
Antigüedad: 14 años, 9 meses
Puntos: 2
Duda simple de asignación

Buenas, hace unos dias acabo de empezar a estudiar python, pero no me queda claro con un tema de la asignacion, me explico.

En este ejemplo, en las ultimas lineas llamo a la funcion quicksort ingresando una lista aleatoria de parametro, pero luego me doy cuenta que una vez que cuando termina el metodo, me ordenó la "lista_aleatoria" sin que se lo asignara, como puedo evitar esto? ya q necesito de la lista aleatoria para usarlo en otros metodos de ordenamiento.

Código PHP:
import random

lista_aleatoria 
= []
longitud 100

def quicksort
(datosprimeroultimo):
    
primero
    j 
ultimo
    pivote 
= (datos[primero] + datos[ultimo]) / 2
    
while j:
        while 
datos[i] < pivotei+=1
        
while datos[j] > pivotej-=1
        
if <= j:
            
aux datos[i]
            
datos[i] = datos[j]
            
datos[j] = aux
            i
+=1
            j
-=1
 
    
if primero jdatos quicksort(datosprimeroj)
    if 
ultimo idatos quicksort(datosiultimo)
    return 
datos


for i in range(longitud-1):
    
longitud i
    lista_aleatoria
.append(random.randint(1100))
    
quicksort(lista_aleatoria,0,len(lista_aleatoria)-1)
    
for 
i in range(longitud-1):
    print(
lista_aleatoria[i]) 
  #2 (permalink)  
Antiguo 01/06/2011, 10:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda simple de asignación

Código Python:
Ver original
  1. import random
  2.  
  3. lista_aleatoria = []
  4. longitud = 100
  5.  
  6. def quicksort(datos, primero, ultimo):
  7.     datos = datos[:]
  8.     i = primero
  9.     j = ultimo
  10.     pivote = (datos[primero] + datos[ultimo]) / 2
  11.     while i < j:
  12.         while datos[i] < pivote: i+=1
  13.         while datos[j] > pivote: j-=1
  14.         if i <= j:
  15.             aux = datos[i]
  16.             datos[i] = datos[j]
  17.             datos[j] = aux
  18.             i+=1
  19.             j-=1
  20.  
  21.     if primero < j: datos = quicksort(datos, primero, j)
  22.     if ultimo > i: datos = quicksort(datos, i, ultimo)
  23.     return datos
  24.  
  25.  
  26. for i in range(longitud-1):
  27.     j = longitud - i
  28.     lista_aleatoria.append(random.randint(1, 100))
  29.      
  30. lista_ordenada = quicksort(lista_aleatoria,0,len(lista_aleatoria)-1)
  31. print lista_aleatoria
  32. print lista_ordenada

Lo que pasa es que estas haciendo operaciones *IN-PLACE*
Ejemplo:
Código Python:
Ver original
  1. lista = [1, 2, 3]
  2. def f(dato):
  3.     dato[2] = 4 #Esto es una operacion *IN-PLACE*
  4.     return dato
  5. lista2 = f(lista) #Ahora lista y lista2 son: [1, 2, 4]
  6. #Y de hecho son la misma lista

#En cambio
Código Python:
Ver original
  1. numero = 5
  2. def f(dato):
  3.     dato += 1 #Esto no es una operacion *IN-PLACE*
  4.     return dato
  5. numero2 = f(numero)
  6. print numero #numero es 5
  7. print numero2 #numero es 6

Una regla simple para saber si puedo o no hacer operaciones IN-PLACE es saber si el tipo de dato es mutable o no.
En el caso de los enteros no es mutable, pero en caso de las listas y diccionarios si lo son. Así que la mayoría de las operaciones que hagas con tipos de datos mutables son IN-PLACE.

Cuando son tipos de datos mutables cualquier operación que hagas con ellos regresan una copia. Si son mutables la mayoría de las operaciones *IN-PLACE* por ejemplo.
Código Python:
Ver original
  1. lista = [1, 2, 0, 2, -1, 7]
  2. lista.sort() #Esto no devuelve una lista ordenada, si no que lo hace *IN-PLACE*
  3. print lista
  #3 (permalink)  
Antiguo 01/06/2011, 14:11
 
Fecha de Ingreso: junio-2009
Mensajes: 84
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Duda simple de asignación

Gracias razpeitia, estube leyendo un poco, tenia algo que ver con que las referencias de ambas variables apuntan a una direccion de memoria, por lo cual si cambio uno por una operación, se cambia la otra.

Intenté copiar la lista con otra nueva con tal de que las operaciones q hague no le afecte a la otra, pero al final igual pasa.

¿Hay forma de evitarlo, algo asi como hacer una copia de la lista y esta desrreferenciale la direccion de memoria a otra?, o ¿algun metodo q me ayude?
  #4 (permalink)  
Antiguo 01/06/2011, 14:23
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda simple de asignación

De hecho tu código que copie y pegue, esta corregido.
  #5 (permalink)  
Antiguo 01/06/2011, 14:41
 
Fecha de Ingreso: junio-2009
Mensajes: 84
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Duda simple de asignación

Cita:
Iniciado por razpeitia Ver Mensaje
De hecho tu código que copie y pegue, esta corregido.
Gracias no me habia fijado, pensé q era un quote xP

Entonces en la sentencia... datos = datos[:]
¿es donde se realiza la desrreferencia de la direccion ocupada de lista_aleatoria?

Muxas gracias
  #6 (permalink)  
Antiguo 01/06/2011, 14:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda simple de asignación

Código:
datos = datos[:]
Lo que hace es una copia superficial (shallow copy) de la lista. Para no modificar la original.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:14.