Python modificando parte de la lista en la función

Considere la siguiente pieza de código:

def func1(a): a[:] = [x**2 for x in a] a = range(10) print a #prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] func1(a[:5]) print a #also prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Deseo enviar una porción de la lista a y cambiarla dentro de la función. Mi salida esperada es

 [0, 1, 4, 9, 16, 5, 6, 7, 8, 9] 

¿De qué manera es la forma idiomática de hacerlo?

¡Gracias!

Si corta la lista, solo modifica una copia, por lo que lo que quiere hacer no funciona en el formulario que desea.

Pero podría pasar un objeto de func1 opcional a func1 y, si no es None , utilícelo para realizar la asignación de func1 (o utilice [:] )

Haría lo siguiente (usé una lambda para evitar copiar / pegar de la fórmula y una expresión generadora para evitar crear una lista temporal inútil:

 def func1(a,the_slice=None): e = lambda y : (x**2 for x in y) if the_slice: a[the_slice] = e(a[the_slice]) else: a[:] = e(a) 

pruebas:

 a = list(range(10)) func1(a) print(a) a = list(range(10)) func1(a,slice(5)) # stop at 5 print(a) a = list(range(10)) func1(a,slice(5,len(a),2)) # start at 5 / stop at the end, stride/step 2 print(a) 

resultado:

 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] [0, 1, 4, 9, 16, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 25, 6, 49, 8, 81] 
  • En el primer caso, se modificó la totalidad de la lista.
  • En el segundo caso, solo cambió la primera mitad.
  • en el tercer caso, cambió la segunda mitad, pero 1 valor de 2 (zancada = 2)

Esto funcionará:

 a = range(10) a[:5] = [c**2 for c in a[:5]] 

a[:5] crea una nueva lista. Por lo tanto, los cambios que func1 aplica no se reflejan en a . Usted podría agregar el corte a la función:

 def func1(a, start=None, stop=None, step=None): start = start if start is not None else 0 stop = stop if stop is not None else len(a) step = step if step is not None else 1 a[start:stop:step] = [x**2 for x in a[start:stop:step]] func1(a, stop=5)