2011-01-15 20 views
25

Algunos lenguajes tienen la característica de devolver valores usando parámetros como C#. Vamos a echar un vistazo a un ejemplo:¿Hay alguna manera en Python para devolver un valor a través de un parámetro de salida?

class OutClass 
{ 
    static void OutMethod(out int age) 
    { 
     age = 26; 
    } 
    static void Main() 
    { 
     int value; 
     OutMethod(out value); 
     // value is now 26 
    } 
} 

Entonces, ¿hay algo similar en Python para obtener un valor medio del parámetro, también?

+0

Pregunta difícil de entender. ¿Cuidado para elaborar? – tokland

+0

@tokland: Creo que lo que el OP quiere hacer es pasar argumentos por referencia en lugar de por valor, como normalmente lo hace Python. –

+0

¿Quisiste decir "salida" - "retorno"? O algo así como pasar parámetros por referencia? – Elalfer

Respuesta

41

No hay ninguna razón para, desde Python puede devolver múltiples valores:

def func(): 
    return 1,2,3 

a,b,c = func() 

Pero también puede pasar un parámetro mutable, y valores de retorno, así:

def func(a): 
    a.append(1) 
    a.append(2) 
    a.append(3) 

L=[] 
func(L) 
print L 
+4

Sí, esta es la manera de obtener múltiples valores de retorno en python. Devolver tuplas es mejor que tratar de modificar uno de los parámetros dados – helloworld922

+1

No estoy muy seguro de si es apropiado decir "devolver múltiples valores" aquí. De hecho, devuelve un valor que es una 'tupla' que contiene múltiples elementos. – Tarik

+10

Hay una razón. Por ejemplo, conocido patrón 'TryDo': 'if try_parse (resultado de salida): print (result)'. Este código está limpio. Intenta usar tuplas aquí y se pondrá feo. – renadeen

3

Pase una lista o algo así y coloque el valor de retorno allí.

5

¿Quieres decir pasar por referencia?

Para el objeto Python, el valor predeterminado es pasar por referencia. Sin embargo, no creo que pueda cambiar la referencia en Python (de lo contrario, no afectará el objeto original).

Por ejemplo:

def addToList(theList): 
    theList.append(3) 
    theList.append(4) 

def addToNewList(theList): 
    theList = list() 
    theList.append(3) 
    theList.append(4) 

myList = list() 
myList.append(1) 
myList.append(2) 
addToList(myList) 
print(myList) 
addToNewList(myList) 
print(myList) 
+2

Correcto, la referencia se pasa por valor. –

+4

Python es "llamada por objeto". http://effbot.org/zone/call-by-object.htm –

+0

Python es ** no ** llamada por referencia. –

0

Además, si le apetece leer algún código, creo que pywin32 tiene una manera de manejar los parámetros de salida.

En la API de Windows es una práctica común confiar mucho en los parámetros de salida, por lo que creo que deben haberlo solucionado de alguna manera.

0

Puede hacerlo con objetos mutables, pero en la mayoría de los casos no tiene sentido porque puede devolver varios valores (o un diccionario si desea cambiar el valor de retorno de una función sin interrumpir las llamadas existentes).

Solo puedo pensar en un caso en el que pueda necesitarlo, es decir, enhebrar, o más exactamente, pasar un valor entre subprocesos.

def outer(): 
    class ReturnValue: 
     val = None 
    ret = ReturnValue() 
    def t(): 
     # ret = 5 won't work obviously because that will set 
     # the local name "ret" in the "t" function. But you 
     # can change the attributes of "ret": 
     ret.val = 5 

    threading.Thread(target = t).start() 

    # Later, you can get the return value out of "ret.val" in the outer function 
0

Si los datos de salida son cadenas y números, o si son de tablas unidimensionales de cadenas y números (por lo general, variantes), puede descargarlos mediante el uso de MS Excel, I' proporcioné una solución que utilicé en una aplicación mía cuando me enfrenté a un problema como ese con AutoCAD (hice una pregunta pero no obtuve ninguna respuesta), puede consultar mi solución here

Cuestiones relacionadas