2012-02-16 18 views
25

Tengo una función que analiza un archivo en una lista. Intento devolver esa lista para poder usarla en otras funciones.Lista de devolución de Python de la función

def splitNet(): 
    network = [] 
    for line in open("/home/tom/Dropbox/CN/Python/CW2/network.txt","r").readlines(): 
     line = line.replace("\r\n", "") 
     line = string.split(line, ',') 
     line = map(int, line) 
     network.append(line) 
    return network 

Cuando trato de imprimir la lista fuera de la función (para depuración) me sale este error:

NameError: name 'network' is not defined 

¿Hay algo simple que estoy haciendo mal o hay una mejor manera de pasar variables entre funciones sin usar globales?

+0

Se puede añadir el código en el que se asigna a la red de vuelta a una variable en el alcance e imprimirlo? – sberry

+0

su función splitNet() se ve bien. ¿Podría publicar el código que imprime netwark-list? – alex

+0

Si desea pasar variables entre funciones: ¿por qué no usar parámetros? ¿Por qué evitar los globales? También puede poner su función como métodos y guardar el resultado dentro de la instancia de clase no? – tito

Respuesta

35

Las variables no se puede acceder fuera del ámbito de una función que se definieron en

Basta con hacer esto:.

network = splitNet() 
print network 
+1

Gracias. Hombre, me siento tonto ahora jaja. –

+1

@Schmooo no se preocupe, lo hice hace un tiempo :) –

11

Supongo que no está asignando el valor devuelto a una variable en el alcance.

es decir. no se puede hacer

splitNet() 
print network 

lugar lo haría

network = splitNet() 
print network 

o para el caso

my_returned_network_in_scope = splitNet() 
print my_returned_network_in_scope 

de lo contrario podría declarar la red fuera de la función splitNet, y que sea global, pero ese no es el enfoque recomendado.

+0

@Alex: Gracias por la edición, sí, un error tipográfico. Yendo y viniendo de Java a Python a PHP para ir a Erlang a C++ ... me daña algo horrible. – sberry

+0

Sepa a qué se refiere ... ¡Acabo de comenzar a utilizar Python y ahora he comenzado a eliminarlos en mi PHP/Objective-C! –

4

Los nombres de variables en una función no son visibles en el exterior, por lo que necesita llamar a su función como esta:

networks = splitNet() 
print(networks) 

Un par de otras notas:

  • es posible que desee convertir su función a un iterador, usando yield.
  • No necesita llamar al readlines; la función en sí misma es un iterador.
  • Su función puede estar filtrando el controlador del archivo. Use la declaración with.
  • Puede usar str.split, que es más legible y más fácil de entender que string.split.
  • Su archivo parece ser un archivo CSV. Use el csv module.

En resumen, esta es la forma en que su código debe ser similar:

import csv 
def splitNet(): 
    with open("/home/tom/Dropbox/CN/Python/CW2/network.txt") as nf: 
     for line in csv.reader(nf, delimiter=','): 
      yield map(int, line) 
network = list(splitNet()) 
print (network) 
2

¿Ya llamó a la función? Esto funciona bien (en el intérprete de Python)

>>> def f(): 
... network = [] 
... network.append(1) 
... network.append(2) 
... network.append(3) 
... return network 
... 
>>> network = f() 
>>> print network 
[1, 2, 3] 
3

Su función devuelve una lista de lo que hay que asignarlo a una variable y de tratar de imprimirlo.

network = splitNet() 
print network 

Por ejemplo

>>> def mylist(): 
... myl = [] 
... myl.append('1') 
... return myl 
... 
>>> my_list = mylist() 
>>> my_list 
['1'] 
>>> 
0

Es posible declarar el nombre de la variable asignada a la lista como global, así:

def get_list(): 
    global destination_list 
    destination_list = [] 
    destination_list.extend(('1','2','3')) 
    return destination_list 

get_list() 
print(destination_list) 
+0

Cierto, pero no la mejor manera. Dado que se devuelve el valor, se debe asignar en lugar de ponerlo en el ámbito global. – mbomb007

Cuestiones relacionadas