Ответ 1
Переменные не могут быть доступны за пределами функции, в которой они были определены.
Просто выполните следующее:
network = splitNet()
print 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)
return network
Когда я пытаюсь распечатать список за пределами функции (для отладки), я получаю эту ошибку:
NameError: name 'network' is not defined
Есть ли что-то простое, я делаю неправильно или есть лучший способ передать переменные между функциями без использования глобальных переменных?
Переменные не могут быть доступны за пределами функции, в которой они были определены.
Просто выполните следующее:
network = splitNet()
print network
Я предполагаю, что вы не назначаете возвращаемое значение переменной в области.
т. вы не можете сделать
splitNet()
print network
вместо этого вы
network = splitNet()
print network
или, если на то пошло
my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope
иначе вы могли бы объявить сеть за пределами функции splitNet и сделать ее глобальной, но это не рекомендуется.
Имена переменных в функции не видны снаружи, поэтому вам нужно вызвать вашу функцию следующим образом:
networks = splitNet()
print(networks)
Несколько других примечаний:
readlines
; сама функция является итератором.with
.str.split
, что более читаемо и понятнее, чем string.split
.csv
.В общем, вот как выглядит ваш код:
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)
Ваша функция возвращает список, поэтому вам нужно назначить его переменной и попытаться распечатать ее.
network = splitNet()
print network
Например
>>> def mylist():
... myl = []
... myl.append('1')
... return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>
Вы уже вызвали функцию? Это отлично работает (в интерпретаторе Python)
>>> def f():
... network = []
... network.append(1)
... network.append(2)
... network.append(3)
... return network
...
>>> network = f()
>>> print network
[1, 2, 3]
Вы можете объявить имя переменной, присвоенной списку как global
, например:
def get_list():
global destination_list
destination_list = []
destination_list.extend(('1','2','3'))
return destination_list
get_list()
print(destination_list)
Если вы хотите вернуть элемент или список из определения, вы можете определить его заранее и использовать в качестве переменной во время первоначального написания указанного определения. Если это не должно быть определено в определении. В этом случае вам не нужно писать в конце команду возврата.
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.
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