index - python list to string
Pasar una lista mientras conserva el original (7)
Así que me estoy enseñando Python, y tengo un problema con las listas. Quiero pasarle una lista a mi función y sacar elementos de ella sin perder la lista original. ¿Cómo hago de python "instancia" la lista pasada en lugar de pasar un puntero al original?
Ejemplo:
def burninate(b):
c = []
for i in range(3):
c.append(b.pop())
return c
a = range(6)
d = burninate(a)
print a, d
Salida: [0, 1, 2] [5, 4, 3]
Salida deseada: [0, 1, 2, 3, 4, 5] [5, 4, 3]
¡Gracias!
Como han sugerido otras respuestas, puede proporcionarle a su función una copia de la lista.
Como alternativa, su función podría tomar una copia del argumento:
def burninate(b):
c = []
b = list(b)
for i in range(3):
c.append(b.pop())
return c
Básicamente, debe tener claro en su mente (y en su documentación) si su función cambiará sus argumentos. En mi opinión, las funciones que devuelven valores computados no deberían cambiar sus argumentos, y las funciones que cambian sus argumentos no deberían devolver nada. Vea los [] .sort (), [] .extend (), {} .update (), etc. de python para ver ejemplos. Obviamente hay excepciones (como .pop ()).
Además, dependiendo de su caso particular, podría reescribir la función para evitar el uso de pop () u otras funciones que modifiquen el argumento. p.ej
def burninante(b):
return b[:-4:-1] # return the last three elements in reverse order
Otras versiones:
def burninate(b):
c = []
for i in range(1, 4):
c.append(b[-i])
return c
def burninate(b):
c = b[-4:-1]
c.reverse()
return c
Y algún día te encantará la lista de comprensiones:
def burninate(b):
return [b[-i] for i in range(1,4)]
Puede llamar a burninate()
con una copia de la lista como esta:
d = burninate(a[:])
o,
d = burninate(list(a))
La otra alternativa es hacer una copia de la lista en su método:
def burninate(b):
c=[]
b=b[:]
for i in range(3):
c.append(b.pop())
return c
>>> a = range(6)
>>> b = burninate(a)
>>> print a, b
>>> [0, 1, 2, 3, 4, 5] [5, 4, 3]
Una forma un poco más legible de hacer lo mismo es:
d = burninate(list(a))
Aquí, el constructor list()
crea una nueva lista basada en a
.
Una solución más general sería import copy
y usar copy.copy()
en el parámetro.
burninate = lambda x: x[:-4:-1]
Puede usar copy.deepcopy ()