Ich habe eine Funktion, die eine Datei in eine Liste parst. Ich versuche, diese Liste zurückzugeben, damit ich sie in anderen Funktionen verwenden kann.
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
Wenn ich versuche, die Liste außerhalb der Funktion (zum Debuggen) zu drucken, erhalte ich diese Fehlermeldung:
NameError: name 'network' is not defined
Gibt es etwas einfaches, was ich falsch mache, oder gibt es eine bessere Möglichkeit, Variablen zwischen Funktionen zu übergeben, ohne Globals zu verwenden?
Auf Variablen kann nicht außerhalb des Bereichs einer Funktion zugegriffen werden, in der sie definiert wurden.
Einfach das tun:
network = splitNet()
print network
Ich gehe davon aus, dass Sie den zurückgegebenen Wert keiner Variablen im Gültigkeitsbereich zuweisen.
dh. du kannst es nicht tun
splitNet()
print network
stattdessen würdest du
network = splitNet()
print network
oder für diese Angelegenheit
my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope
andernfalls könnten Sie das Netzwerk außerhalb der Funktion splitNet deklarieren und global machen. Dies ist jedoch nicht die empfohlene Vorgehensweise.
Die Namen von Variablen in einer Funktion sind außerhalb nicht sichtbar. Daher müssen Sie Ihre Funktion folgendermaßen aufrufen:
networks = splitNet()
print(networks)
Ein paar andere Hinweise:
readlines
aufrufen. Die Funktion selbst ist ein Iterator.with
.str.split
verwenden, das besser lesbar und verständlicher ist als string.split
.csv
.Zusammenfassend sollte Ihr Code so aussehen:
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)
Ihre Funktion gibt eine Liste zurück, also müssen Sie sie einer Variablen zuweisen und dann versuchen, sie zu drucken.
network = splitNet()
print network
Zum Beispiel
>>> def mylist():
... myl = []
... myl.append('1')
... return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>
Hast du die Funktion eigentlich schon angerufen? Das funktioniert gut (im Python-Interpreter)
>>> def f():
... network = []
... network.append(1)
... network.append(2)
... network.append(3)
... return network
...
>>> network = f()
>>> print network
[1, 2, 3]
L=[1, 2, 3]
def rl(l):
return l
[*ll] = rl(L) # ll is in a list
ll
# >>> [1, 2, 3]
*t, = rl(L) # ll is in a Tuple
t
# >>> [1, 2, 3]
L=[1,2,3]
def rl(l): return l
[*ll]=rl(L) #ll is in a list
ll
*t,=rl(L) #ll is in a Tuple
t
Wenn Sie ein Element oder eine Liste aus einer Definition zurückgeben möchten, können Sie diese zuvor definieren und beim ersten Schreiben der Definition als Variable verwenden. Es sei denn, es muss innerhalb der Definition definiert werden. In diesem Fall müssen Sie am Ende keinen Rückkehrbefehl eingeben.
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.
Sie können den Namen der der Liste zugewiesenen Variablen wie folgt als global
angeben:
def get_list():
global destination_list
destination_list = []
destination_list.extend(('1','2','3'))
return destination_list
get_list()
print(destination_list)