Python 从函数返回列表

53 投票
8 回答
382504 浏览
提问于 2025-04-17 13:08

我有一个函数,它可以把一个文件解析成一个列表。我想把这个列表返回,这样我就可以在其他函数中使用它。

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

我是不是做错了什么简单的事情,或者有没有更好的方法在函数之间传递变量,而不使用全局变量?

8 个回答

8

函数里的变量名在外面是看不见的,所以你需要这样调用你的函数:

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)
18

我猜你没有把返回的值赋给一个可以使用的变量。

也就是说,你不能这样做:

splitNet()
print network

你应该这样做:

network = splitNet()
print network

或者这样:

my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope

另外,你也可以把网络变量放在splitNet函数外面,这样它就变成全局变量了,但这样做并不是推荐的方式。

64

变量不能在它们被定义的函数外部被访问。

你只需要这样做:

network = splitNet()
print network

撰写回答