2017-02-14 3 views
1

Я студент и только начинаю изучать код. Сейчас я работаю с Python и есть программа, я думаю, что должно работать, но просто возвращает некоторые ошибки, которые я не понимаю:Начинающий пытается отладить простую программу

Traceback (most recent call last): File "C:\Program Files\Notepad++\1913lab3.py", line 23, in print(most(odd, []))

File "C:\Program Files\Notepad++\1913lab3.py", line 9, in most N = S[i] UnboundLocalError: local variable 'i' referenced before assignment

Я не понимаю, что первая ошибка говорит мне, но Я думаю, что понимаю вторую, но я не понимаю, почему я ее получаю. Я не думаю, что я локальная переменная, как я определил ее сразу в начале. Вот код:

t = 0 
f = 0 
i = 0 

def odd(N): 
    return N % 2 != 0 

def most(P, S): 
    N = S[i] 
    if P == True: 
     t += 1 
    else: 
     f += 1 
    i += 1 
    if i < len(S): 
     most(P, S) 
    else: 
     if t > f: 
      return 'True' 
     else: 
      return 'False' 

print(most(odd, [])) 
print(most(odd, [0])) 
print(most(odd, [1])) 
print(most(odd, [1, 2])) 
print(most(odd, [1, 2, 3])) 

Назначение - определить рекурсивную функцию (most()). Функция принимает одну функцию и один список в качестве своих аргументов (P и S). Я не могу использовать петли или локальные переменные. Вот цитата из задания:

"P is a function of one argument that returns either True or False, and S is a list. The function most calls P on each element of S. It must return True if P returns True more often than it returns False. It must return False otherwise."

В 5 команд печати лишь 5 примеров, что мне нужно работать на кредит, но эта программа должна работать для всех списков. Если кто-то может помочь мне исправить эти ошибки, это будет здорово. (Также приветствуются любые общие советы Python.)

+0

Посмотрите на этот ответ: http://stackoverflow.com/questions/10851906/python-3-unboundlocalerror-local-variable-referenced-before-assignment#10852003 – Jackowski

+0

Посмотрите этот вопрос: (http: // stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-created-them). Ваша проблема заключается в том, что вы пытаетесь изменить глобальные переменные внутри своих функций, но поскольку python не заставляет вас объявлять свои переменные перед их использованием, python не знает, следует ли интерпретировать использование вами переменных внутри функции как создание новой переменной, которая существует только внутри функции, или если вы имеете в виду глобальную переменную с этим именем. –

+0

@Amorpheuses Но он определил 'i' глобально, и это, вероятно, заставило его поверить, что он использовал« глобальную »переменную' i'. Кроме того, ваш комментарий встречается как немного грубый ... –

ответ

0

По умолчанию любая переменная, которая модифицирована внутри функции, считается локальной для этой функции. Поэтому, если у вас есть i += 1, сначала необходимо определить i внутри функции. Или вы должны объявить i глобальным первым (global i), чтобы python знал, что он ссылается на i, который вы определили (первым) вне функции. Но будьте осторожны с глобалами, они часто опасны (поскольку они затрудняют отслеживание происходящего), и их следует избегать, если это возможно.

+0

Спасибо за быстрый ответ! Похоже, что я могу решить эту проблему, но вставив «global i» в начало моей функции, но это не одобряется и может быть проблематичным. Как я мог обойтись с помощью глобальной команды? Назначение лаборатории позволяет мне использовать только два входа, P и S, для самой функции. –

+0

Вы можете, например, определить вспомогательную рекурсивную функцию, которая возвращает разницу между числом True и False. А затем просто проверьте признак этой разницы. – Julien

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