def threshold(the_list,thresholding_value,upper_val,lower_value):
ret_list=list(the_list)
for each_item in ret_list:
if each_item <= thresholding_value:
each_item=lower_value
else:
each_item=upper_val
return ret_list
temp=[-1,2,5,3,-1,5,32,-6]
ttt=r.threshold(temp,0,1,0)
Después de la exención sigo obteniendo el valor de la misma lista
3 respuestas
Las listas no son inmutables, pero cuando realiza un bucle sobre una, la variable de control de bucle obtiene una copia de cada elemento; no es un alias para eso. Por lo tanto, cambiarlo no afecta la lista.
Una forma más pitónica de hacer esto sería una comprensión de la lista que devuelve la nueva lista:
def threshold(the_list, threshold, upper, lower):
return [lower if item <= threshold else upper for item in the_list]
threshold([-1,2,5,3,-1,5,32,-6],0,1,0)
# => [0, 1, 1, 1, 0, 1, 1, 0]
Las listas son definitivamente mutables. Lo que sucede es que iteras sobre la lista, con cada elemento copiado a each_item
a su vez. Lo que le sucede a cada elemento no es relevante para la lista, ya que es solo una variable temporal para mantener su valor, no un puntero.
Representar cada elemento como una lista de 1 elemento o una clase solucionaría su problema, pero el enfoque completo no es cómo se hace generalmente en python: por qué crear una copia de la lista cuando puede crear una lista vacía para el valor de retorno y agregar elementos como ¿anda tu?
Each_item es solo una variable local que tiene su valor reemplazado con el operador =
. Asignarle un valor no afectará la lista original. En su lugar, puede crear una nueva lista y completarla antes de devolverla:
def threshold(the_list, thresholding_value, upper_val, lower_val):
ret_list = list()
for each_item in the_list:
if each_item <= thresholding_value:
ret_list.append(lower_val)
else:
ret_list.append(upper_val)
return ret_list
También podría acortar significativamente este código mediante el uso de comprensiones de listas:
def threshold(the_list, thresholding_value, upper_val, lower_val):
return [lower_val if x <= thresholding_value else upper_val for x in the_list]
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.