2016-03-10 3 views
-2
puzzle = [[' 1', ' 2', ' 3', ' 4'], [' 5', ' 6', ' 7', ' 8'],[ ' 9', '10', '11', '12'], ['13', '14', '15', ' X']] 

def find_pos(alist, item): 
    for i in alist: 
     for j in range(4): 
      if i[j] == item: 
       row = alist.index(i) 
       col = j 

find_pos(puzzle,' X') 

a = row 
print(a) 

Я думаю, что я определил имя row, запустив функцию find_pos, если нет, то как это исправить, чтобы получить rowпитон NameError: имя «ххх» не определен

Не ставьте печать в find_pos функция

+1

Переменные, созданные внутри функции, не возвращаются в глобальную область после вызова функции. –

+0

Область/блок Python определяется отступом ... – Ian

+0

Приветствуем и приветствуем процесс stackoverflow. Пожалуйста, сохраните весь код, связанный с вопросом, поэтому нет смысла пытаться его прочитать. – zmo

ответ

4

Просто возвращать значения из функции:

puzzle = [[' 1', ' 2', ' 3', ' 4'], [' 5', ' 6', ' 7', ' 8'],[ ' 9', '10', '11', '12'], ['13', '14', '15', ' X']] 

def find_pos(alist, item): 
    for i in alist: 
     for j in range(4): 
      if i[j] == item: 
       row = alist.index(i) 
       col = j 
       return row, col 

row, col = find_pos(puzzle,' X') 

print(row) 

Обратите внимание, что если элемент не найден, он будет возвращать None (потому что каждая функция, которая ничего не возвращает, возвращает по умолчанию None), и в этом случае код выдает ошибку.

+0

oh я вижу большое спасибо –

+0

Один комментарий: Если я читаю это право, оператор 'return row, col' должен находиться на том же уровне отступов, что и' for'. В противном случае он будет делать возврат в первый раз через списки, где 'i [j] == item'. –

+0

@ DougR. Я считаю, что это исправленный эффект: найти первый экземпляр где 'i [j] == item'. – L3viathan