我有一个将文件解析为列表的函数。我正在尝试返回该列表,以便我可以在其他功能中使用它。
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
是否有一些简单的我做错了或者是否有更好的方法在不使用全局变量的情况下在函数之间传递变量?
答案 0 :(得分:45)
无法在定义函数范围之外访问变量。
只需这样做:
network = splitNet()
print network
答案 1 :(得分:14)
我假设您没有将返回值分配给范围内的变量。
即。你做不到
splitNet()
print network
相反,你会
network = splitNet()
print network
或者就此而言
my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope
否则你可以在splitNet函数之外声明网络,并使其成为全局网络,但这不是推荐的方法。
答案 2 :(得分:6)
函数中的变量名称在外部不可见,因此您需要像这样调用函数:
networks = splitNet()
print(networks)
其他几点说明:
readlines
;函数本身就是一个迭代器。with
声明。str.split
,string.split
比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)
更易读,更易于理解。csv
module。总之,这是您的代码的样子:
{{1}}
答案 3 :(得分:4)
您的函数正在返回一个列表,因此您必须将其分配给变量,而不是尝试打印它。
network = splitNet()
print network
例如
>>> def mylist():
... myl = []
... myl.append('1')
... return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>
答案 4 :(得分:2)
你真的打过电话吗?这很好(在Python解释器中)
>>> def f():
... network = []
... network.append(1)
... network.append(2)
... network.append(3)
... return network
...
>>> network = f()
>>> print network
[1, 2, 3]
答案 5 :(得分:1)
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]
答案 6 :(得分:0)
您可以将分配给列表的变量的名称声明为global
,如下所示:
def get_list():
global destination_list
destination_list = []
destination_list.extend(('1','2','3'))
return destination_list
get_list()
print(destination_list)
答案 7 :(得分:0)
如果要从定义中返回项目或列表,则可以先对其进行定义,然后在该定义的初始编写过程中将其用作变量。除非必须在定义内定义。在这种情况下,您无需在末尾写回车命令。
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.
答案 8 :(得分:0)
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