J'ai une fonction qui analyse un fichier dans une liste. J'essaie de renvoyer cette liste pour pouvoir l'utiliser dans d'autres fonctions.
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
Lorsque j'essaie d'imprimer la liste en dehors de la fonction (pour le débogage), j'obtiens cette erreur:
NameError: name 'network' is not defined
Y a-t-il quelque chose de simple que je ne fais pas correctement ou existe-t-il un meilleur moyen de passer des variables entre des fonctions sans utiliser de globals?
Les variables ne sont pas accessibles en dehors de la portée d'une fonction dans laquelle elles ont été définies.
Faites simplement ceci:
network = splitNet()
print network
Je suppose que vous n'affectez pas la valeur renvoyée à une variable de portée.
c'est à dire. tu ne peux pas faire
splitNet()
print network
vous le feriez plutôt
network = splitNet()
print network
ou d'ailleurs
my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope
sinon, vous pouvez déclarer le réseau en dehors de la fonction splitNet et le rendre global, mais ce n'est pas l'approche recommandée.
Les noms des variables dans une fonction ne sont pas visibles à l'extérieur. Vous devez donc appeler votre fonction comme suit:
networks = splitNet()
print(networks)
Quelques autres notes:
readlines
; la fonction elle-même est un itérateur.with
.str.split
, qui est plus lisible et plus facile à comprendre que string.split
.csv
.En résumé, voici à quoi votre code devrait ressembler:
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)
Votre fonction renvoie une liste, vous devez donc l'affecter à une variable et essayer de l'imprimer.
network = splitNet()
print network
Par exemple
>>> def mylist():
... myl = []
... myl.append('1')
... return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>
Avez-vous déjà appelé la fonction? Cela fonctionne bien (dans l'interpréteur Python)
>>> def f():
... network = []
... network.append(1)
... network.append(2)
... network.append(3)
... return network
...
>>> network = f()
>>> print network
[1, 2, 3]
Si vous souhaitez renvoyer un élément ou une liste à partir d'une définition, vous pouvez le définir à l'avance et l'utiliser comme variable lors de l'écriture initiale de cette définition. Sauf si cela doit être défini dans la définition. Dans ce cas, vous n'aurez pas besoin d'écrire dans une commande de retour à la fin.
network = []
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)
print network # Will print the list you've appended. But it is now a usable object.
Vous pouvez déclarer le nom de la variable assignée à la liste en tant que global
, comme ceci:
def get_list():
global destination_list
destination_list = []
destination_list.extend(('1','2','3'))
return destination_list
get_list()
print(destination_list)