2013-03-19 42 views
1

我很努力地通過一個列表(holder,其中包含[0,0])到另一個函數。我想check_neighbours拿起列表,然後做一些進一步的處理。我想我在main()中正確傳遞它,但我不確定我需要做些什麼才能讓列表在check_neighbours內部被簡單顯示時顯示其內容。我已經嘗試了=持有人,但我收到的錯誤:功能之間的python傳遞列表

global name "holder" is not defined

我相信我一定要把holder = #something這裏,但我想不出什麼。

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): 
     i=0 
     j=0 
     #point node to pos [0][0] of Alist 
     node = Alist[i][j] 
     #create a list to hold co-ordinates 
     holder = [] 
     holder.append(i) 
     holder.append(j) 
     print holder 

     return node, holder 

#test neighbours to see if they can be used 
def check_neighbours(node, Alist): 
     holder = #something 



#code begins here 
def main(): 
     file = ("F:/media/KINGSTON/Networking/network.txt") 
     Alist = create_matrix(file) 
     node = start_node(Alist) 
     holder = check_neighbours(node, Alist) 
main() 

回答

4

截至start_node結束,你這樣做:

return node, holder 

...但是當你調用它,你這樣做:

node = start_node(Alist) 

這意味着當地node變量結束作爲node, holder的元組。你不想那樣。你想這樣的:

node, holder = start_node(Alist) 

同時,你說「我想我正確地傳遞給它的main()函數」,但你不所有經過它在main功能:

holder = check_neighbours(node, Alist) 

這裏沒有辦法讓check_neighbours在這裏得到holder,因爲您在這裏沒有給它holder

另外,當你定義check_neighbours,你這樣做:

def check_neighbours(node, Alist): 
    holder = #something 

這不採取holder參數,它定義了一個名爲holder新的本地變量。因此,改變那些兩行:

def check_neighbours(node, Alist, holder): 

裏調用:

holder = check_neighbours(node, Alist, holder) 

另外請注意,您是分配的check_neighborsholder變量的結果,免去無論你在傳遞通常情況下,這是一個非常合理的事情(想想my_name = my_name.replace('Joseph', 'Joe')),但要確保它確實是你想要的(當然,確保check_neighborsreturn holder結尾,或者返回一些其他適當的值)。

最後,正如我在你的另一個問題中所說的:如果你繼續使用相同的名字作爲你的參數和你傳入的值,你會繼續像這樣混淆你自己。如果你使用不同的名字,那麼你會更容易看到你錯過了什麼。即使是一些爲每一個前綴那麼簡單:

def main(): 
    file = ("F:/media/KINGSTON/Networking/network.txt") 
    my_list = create_matrix(file) 
    my_node, my_holder = start_node(my_list) 
    my_new_holder = check_neighbours(my_node, my_list, my_holder) 
+0

再次感謝你,我想提出關於相當多的假設,我的傳球怎麼變的作品,但感謝您的幫助很大 – bigl 2013-03-19 01:15:22

+0

@bigl:這裏的拇指簡單的規則:變量傳遞總是完全明確的。如果你有'def foo(x,y,z):',並且以'return v,w'結束,你總是需要用3個值來調用它,並將結果存儲爲2,比如'a,b = foo(c,d,e)'。 (這個經驗法則在更復雜的情況下被修改,比如帶有方法的類,全局變量等等,但是現在忽略它們。) – abarnert 2013-03-19 01:18:04

+0

非常感謝你提供了非常有用的信息。現在一切都很好。 – bigl 2013-03-19 01:28:10