Python возвращает список из функции - PullRequest
33 голосов
/ 16 февраля 2012

У меня есть функция, которая разбирает файл в список. Я пытаюсь вернуть этот список, чтобы я мог использовать его в других функциях.

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

Есть ли что-то простое, что я делаю неправильно, или есть лучший способ передачи переменных между функциями без использования глобальных переменных?

Ответы [ 9 ]

45 голосов
/ 16 февраля 2012

Переменные не могут быть доступны вне области функции, в которой они были определены.

Просто сделайте это:

network = splitNet()
print network
14 голосов
/ 16 февраля 2012

Полагаю, вы не присваиваете возвращаемое значение переменной в области видимости.

т. ты не можешь сделать

splitNet()
print network

вместо этого вы бы

network = splitNet()
print network

или в этом отношении

my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope

в противном случае вы можете объявить сеть вне функции splitNet и сделать ее глобальной, но это не рекомендуемый подход.

6 голосов
/ 16 февраля 2012

Имена переменных в функции не видны снаружи, поэтому вам нужно вызвать вашу функцию следующим образом:

networks = splitNet()
print(networks)

Несколько других примечаний:

  • Выможет потребоваться преобразовать вашу функцию в итератор, используя yield .
  • Вам не нужно вызывать readlines;Сама функция является итератором.
  • Возможно, ваша функция пропускает дескриптор файла.Используйте оператор with.
  • Вы можете использовать str.split, который более удобочитаем и понятен, чем string.split.
  • Ваш файл выглядит как файл CSV.Используйте модуль 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)
4 голосов
/ 16 февраля 2012

Ваша функция возвращает список, поэтому вам нужно присвоить его переменной, а затем попытаться распечатать.

network = splitNet()
print network

Например

>>> def mylist():
...    myl = []
...    myl.append('1')
...    return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>
2 голосов
/ 16 февраля 2012

Вы уже вызвали функцию? Это прекрасно работает (в интерпретаторе Python)

 >>> def f():
 ...   network = []
 ...   network.append(1)
 ...   network.append(2)
 ...   network.append(3)
 ...   return network
 ...
 >>> network = f()
 >>> print network
 [1, 2, 3]
0 голосов
/ 27 июня 2019
L=[1,2,3]
def rl(l): return l

[*ll]=rl(L) #ll is in a list
ll

Out [45]: [1, 2, 3]

*t,=rl(L) #ll is in a tuple
t

Out [47]: [1, 2, 3]

0 голосов
/ 27 июня 2019
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]
0 голосов
/ 07 октября 2018

Если вы хотите вернуть элемент или список из определения, вы можете определить его заранее и использовать в качестве переменной во время первоначального написания указанного определения. Если это не должно быть определено в определении. В этом случае вам не нужно писать в конце команду возврата.

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. 
0 голосов
/ 28 апреля 2016

Вы можете объявить имя переменной, назначенной списку, как global, например:

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

get_list()
print(destination_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...