Python从函数返回列表

Tho*_*ell 38 python function list

我有一个将文件解析为列表的函数.我正在尝试返回该列表,以便我可以在其他功能中使用它.

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
Run Code Online (Sandbox Code Playgroud)

当我尝试在函数外部打印列表(用于调试)时,我收到此错误:

NameError: name 'network' is not defined
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lan 49

变量不能在它们定义的函数范围之外访问.

只需这样做:

network = splitNet()
print network
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。男人,我现在觉得很蠢哈哈。 (3认同)
  • @Schmooo 别担心,我不久前就这样做了 :) (2认同)

sbe*_*rry 14

我假设您没有将返回值分配给范围内的变量.

即.你不能这样做

splitNet()
print network
Run Code Online (Sandbox Code Playgroud)

相反,你会

network = splitNet()
print network
Run Code Online (Sandbox Code Playgroud)

或者就此而言

my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope
Run Code Online (Sandbox Code Playgroud)

否则你可以在splitNet函数之外声明网络,并使其成为全局网络,但这不是推荐的方法.


phi*_*hag 6

函数中的变量名称在外部不可见,因此您需要像这样调用函数:

networks = splitNet()
print(networks)
Run Code Online (Sandbox Code Playgroud)

其他几点说明:

  • 您可能希望使用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)
Run Code Online (Sandbox Code Playgroud)


Ran*_*Rag 5

您的函数正在返回一个列表,因此您必须将其分配给一个变量,然后再尝试打印它。

network = splitNet()
print network
Run Code Online (Sandbox Code Playgroud)

例如

>>> def mylist():
...    myl = []
...    myl.append('1')
...    return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>
Run Code Online (Sandbox Code Playgroud)