2013-03-18 145 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