2013-03-19 4 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 функции:

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_neighbors обратно в переменную holder, заменив все, что вы прошли в Часто думаю, что это вполне разумная вещь (думаю, my_name = my_name.replace('Joseph', 'Joe')), но убедитесь, что это действительно то, что вы хотите (и, конечно же, убедитесь, что check_neighbors заканчивается, делая return 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

+0

@bigl: Вот простое правило: Переменная передача всегда полностью явная.Если у вас есть 'def foo (x, y, z):', и он заканчивается на 'return v, w', вам всегда нужно вызвать его с 3 значениями и сохранить результат в 2, например' a, b = foo (c, d, e) '. (Это эмпирическое правило модифицируется в более сложных случаях, например, классы с методами, глобальные переменные и т. Д., Но пока игнорируйте их.) – abarnert

+0

благодарю вас за это, очень полезную информацию. теперь все отлично работает. – bigl

Смежные вопросы