2013-03-18 113 views
0

我想将整数传递给函数。我认为这可能不起作用,因为我多次打电话给它?例如,我在一个名为Alist的函数中创建一个2d矩阵,然后返回它。通过第二个函数,我传递了Alist,并指定了我想要从Alist返回的值的位置。最后(到目前为止),第三个函数将要求返回的值和Alist。 Alist打印的正确,但返回的值(节点)打印0时,它应该是4.我想它是使用node = 0变量声明在代码的顶部,但我不知道为什么。python传递函数之间的变量

NETWORK.TXT的第一行是这样的: 0,2,4,1,6,0,

Alist = [] 
node = 0 

file = ("F:/media/KINGSTON/Networking/network.txt") 

def create_matrix(file): 
    with open('network.txt') as f: 
     Alist = [] 
     for line in f: 
      part = [] 
      for x in line.split(','): 
       part.append(int(x)) 
      Alist.append(part) 
    return Alist 

def start_node(Alist): 
     node = Alist[0][2] 
     print (node) 
     return node 

#test neighbours to see if they can be used 
def check_neighbours(node, Alist): 
     print (Alist) 
     print (node) 
     #check for neighbours. if we start at [0][0] we must look for [0][1] 
     #and [1][0]. Figure out how to add 1 to each cell to navigate across. 

#running of code begins here 
Alist = create_matrix(file) 
start_node(Alist) 
check_neighbours(node, Alist) 
+1

您需要向我们展示的是调用这些函数的代码。理想的问题是[SSCCE](http://sscce.org) - 我们可以针对您的输入执行某项操作,并查看输出与预期输出的不同。 – abarnert 2013-03-18 17:52:31

+0

与此同时,让全局变量,函数参数和局部变量都具有相同的名称是非常令人困惑的,它是一个红色的标志,您希望我们看不到代码中的某种魔力。例如,在'start_node'中设置的'node'不是全局的。它被返回,但除非调用者正在做'node = start_node(Alist)'来设置全局,否则全局不会改变,所以值将仍为0. – abarnert 2013-03-18 17:53:56

+0

@abarnert已更新 – bigl 2013-03-18 17:55:15

回答

2

这是你的问题,在第二行“的代码的运行就从这里开始”:

Alist = create_matrix(file) 
start_node(Alist) 
check_neighbours(node, Alist) 

当你调用start_node(Alist),它会创建一个局部变量(这恰好被称为node),并返回它的值,你只是忽略了。这意味着全局变量node(尽管巧合名)没有被改变,所以它仍然是0。

为了使这项工作,你需要做的就行了上面做同样的事情:

node = start_node(Alist) 

然而,为了使你的代码少混乱,你真的应该做几件事情:

首先,删除Alist = []node = 0顶部。在函数之前定义它们会使它看起来像你希望它们在函数中用作全局变量,这是误导性的。 (file也是如此 - 你确实需要定义它,但不是在顶部)

然后,如果你将所有顶层的东西(包括那两个全局变量)抽象成一个函数,这会带走所有混淆的可能性。

所以,离开你的三个函数的定义,那么:

def main(): 
    file = ("F:/media/KINGSTON/Networking/network.txt") 
    Alist = create_matrix(file) 
    node = start_node(Alist) 
    check_neighbours(node, Alist) 
main() 
+0

非常感谢,效果很好 – bigl 2013-03-18 18:15:37

-1

在功能create_matrix当你写Alist = []您创建一个新的局部变量Alist,它影响全局变量Alist。请尝试以下操作:

def create_matrix(file): 
    global Alist # Mark Alist as global variable 
    with open('network.txt') as f: 
     Alist = [] 
     for line in f: 
      part = [] 
      for x in line.split(','): 
       part.append(int(x)) 
      Alist.append(part) 
    return Alist 

查看更多的global keyword documentation

+0

This isn '这个问题。他有一个'Alist = create_matrix(file)',它用这个函数返回的值替换全局。另外,正如他在问题中所说的那样,“Alist正在打印良好”。它是'节点',不起作用。同时,鼓励他从传递和返回变量切换到分享全局变量不是一个很好的设计选择。 – abarnert 2013-03-18 18:00:04

+0

abarnert,谢谢你的提示,点了。 – Vladimir 2013-03-18 18:41:31