Pitón. Parámetros y valores devueltos

Al ser relativamente nuevo en Python en esta pregunta, puedo usar una terminología incorrecta y mostraré malentendidos, por lo que estoy aquí.

Estoy estudiando las funciones de Python y estoy tratando de asegurarme de entender cómo se pasan y devuelven las variables.

He escrito esta función trivial para ordenar elementos en una lista

def func_sort_list(NN): for w in NN: print (w, type(w)) NN.sort() print (NN) return (w) 

He asignado valores a una lista

 unsort_letters=['q','w','e','r','t','y'] 

Entonces envidio la función

 func_sort_list(unsort_letters) 

y obtener el resultado

 q  w  e  r  t  y  ['e', 'q', 'r', 't', 'w', 'y'] 'y' 

luego, después de la ejecución, si muestro el contenido de la variable que originalmente pasé a la función que obtengo

 unsort_letters ['e', 'q', 'r', 't', 'w', 'y'] 

Cual es el resultado que quiero.

¿Es correcta la siguiente interpretación de lo que sucedió para que me sienta un poco más segura al escribir funciones?

  1. El valor original de unsort_letters, [‘q’, ‘w’, ‘e’, ​​…], es “global”?

  2. Al llamar a func_sort_list (unsort_letters) ¿He pasado la dirección / puntero de unsort_letters a func_sort_list?

  3. NN es una variable “local” a la función, pero contiene el puntero / dirección a la variable pasada y, dado que una lista es mutable, ¿el contenido de unsort_letters se está modificando dentro de la función?

Lo que me lleva a:

  1. ¿Existe alguna circunstancia en la que no pueda cambiar el contenido del parámetro pasado dentro de la función y tenga que escribir algo como lo siguiente?

     def func_return_only(input_parm): result_var = <> return (result_var) 

Que tengo que envolver de la siguiente manera para obtener el valor de los valores devueltos en var_s.

 var_s = func_return_only(<>) 

?

Tu modelo mental es bastante correcto. Sin embargo, no debe preocuparse por si Python es “pasar por valor” o “pasar por referencia”. Tienes que aprender cómo funciona la asignación en Python. Este es sin duda el mejor recurso para hacerlo. El hecho más importante que se debe saber es que la asignación nunca copia datos .

Una vez que entienda la asignación, lo único que debe saber es que los parámetros de la función se pasan por asignación.

Lo primero que sucede implícitamente cuando llamas a tu función es

 NN = unsort_letters 

unsort_letters en unsort_letters como el argumento. Usted asigna otro nombre ( NN ) a ese argumento, y eso es todo, no se copian datos.

¿Existe alguna circunstancia en la que no pueda cambiar el contenido del parámetro pasado dentro de la función?

Sí, cuando pase lo que pase es inmutable. Los enteros, por ejemplo, no tienen métodos para actualizar su valor, por lo que no puedes mutarlos en el cuerpo de la función (o en cualquier otro lugar).

Sin embargo, es importante tener en cuenta que Python no trata los tipos mutables e inmutables de manera diferente durante la asignación y el paso de parámetros. Simplemente no puede mutar tipos inmutables porque no tienen métodos de mutación en ellos.