2016-07-16 3 views
0

Итак, я хочу, чтобы конечный результат моей программы, чтобы посмотреть, как это ...Python: NameError «» не определен

Desired output

Теперь я не нужны эти точные цифры, потому что это будет помещать робота в симуляцию, поэтому результаты должны отличаться.

Вот мой код:

# This program makes the robot calculate the average amount of light in a simulated room 

from myro import * 
init("simulator") 

from random import* 

def pressC(): 
    """ Wait for "c" to be entered from the keyboard in the Python shell """ 
    entry = " " 
    while(entry != "c"): 
     entry = raw_input("Press c to continue. ") 
    print("Thank you. ") 
    print 

def randomPosition(): 
    """ This gets the robot to drive to a random position """ 
    result = randint(1, 2) 
    if(result == 1): 
     forward(random(), random()) 
    if(result == 2): 
     backward(random(), random()) 

def scan(): 
    """ This allows the robot to rotate and print the numbers that each light sensors obtains """ 
    leftLightSeries = [0,0,0,0,0,0] 
    centerLightSeries = [0,0,0,0,0,0] 
    rightLightSeries = [0,0,0,0,0,0] 
    for index in range(1,6): 
     leftLight = getLight("left") 
     leftLightSeries[index] = leftLightSeries[index] + leftLight 
     centerLight = getLight("center") 
     centerLightSeries[index] = centerLightSeries[index] + centerLight 
     rightLight = getLight("right") 
     rightLightSeries[index] = rightLightSeries[index] + rightLight 
     turnRight(.5,2.739) 
    return leftLightSeries, centerLightSeries, rightLightSeries 

def printResults(): 
    """ This function prints the results of the dice roll simulation.""" 
    print " Average Light Levels " 
    print " L  C  R " 
    print "=========================" 
    for index in range(1, 6): 
     print str(index) + " " + str(leftLightSeries[index]) + " " + str(centerLightSeries[index]) + " " + str(rightLightSeries[index]) 

def main(): 
    senses() 
    pressC() 
    randomPosition() 
    leftLightSeries, centerLightSeries, rightLightSeries = scan() 
    printResults() 

main() 

И, я получаю эту ошибку, когда я запускаю мой код:

Traceback (most recent call last): 
    File "C:/Users/Owner-pc/Desktop/Computer Programming 1/Mod05/Code/Created/AverageLight.py", line 58, in -toplevel- 
    main() 
    File "C:/Users/Owner-pc/Desktop/Computer Programming 1/Mod05/Code/Created/AverageLight.py", line 56, in main 
    printResults() 
    File "C:/Users/Owner-pc/Desktop/Computer Programming 1/Mod05/Code/Created/AverageLight.py", line 49, in printResults 
    print str(index) + " " + str(leftLightSeries[index]) + " " + str(centerLightSeries[index]) + " " + str(rightLightSeries[index]) 
NameError: global name 'leftLightSeries' is not defined 

Итак, я запутался, почему мое возвращение заявление не работает , и почему я не получаю список, который я хочу. Пожалуйста помоги.

+2

Вы отправили этот вопрос менее чем через 12 часов после публикации того же вопроса [здесь] (http://stackoverflow.com/questions/38404825/python-is-not-defined). SO - это _community_ - пожалуйста, не относитесь к нему как к механическому турку. – zeantsoi

ответ

2

leftLightSeries, centerLightSeries и rightLightSeries не определены в объеме printResults именно поэтому вы получаете эту ошибку.

Обновите printResults функцию, чтобы взять в эти аргументы:

def printResults(leftLightSeries, centerLightSeries, rightLightSeries):

Позже, когда вы звоните printResults, передать эти переменные:

def main(): 
    ... 
    printResults(leftLightSeries, centerLightSeries, rightLightSeries) 

Теперь проблема здесь заключается в том, что вы все еще не имеют этих трех переменных, определенных в рамках основного, они определяются только внутри scan. Как вы их получите из scan?Просто хранить возвращенные значения scan в переменных следующим образом:

def main(): 
    senses() 
    pressC() 
    randomPosition() 
    leftLightSeries, centerLightSeries, rightLightSeries = scan() 
    printResults(leftLightSeries, centerLightSeries, rightLightSeries) 

Вы можете также отправить непосредственно выход scan в printResults без необходимости временных переменных: printResults(*scan())

0

Вы определили leftLightSeries и centerLightSeries в функции сканирования(). Поскольку они не определены во внешней области (которая в этом случае будет глобальной областью), функция printResults не может получить к ним доступ.

Питон документация описывает его в разделе 4.2.2. Resolution of names

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

Если имя используется в кодовом блоке, оно разрешается с использованием ближайшего окружения . Набор всех таких областей видимости для кодового блока равен , называемому средой блока.

Когда имя вообще не найдено, возникает исключение NameError. Если текущая область действия является областью действия, а имя относится к локальной переменной , которая еще не привязана к значению в точке, где используется имя , возникает исключение UnboundLocalError. UnboundLocalError является подклассом NameError.

+0

Как я могу это исправить? Должен ли я назначить три переменные функции printResults? –

+0

Да, глобальные переменные обычно являются плохим способом плохого проектирования программного обеспечения. Я думаю, что «назначить» означает «пройти», и это правильный подход. Передача результатов от scan() к функции печати может помочь. Имейте в виду, что вы должны добавить их в список параметров ** printResults **. – HelloWorld

+0

Я не уверен, что вы имеете в виду. Я довольно новичок, сейчас я занимаюсь программированием и изучаю Python. Не могли бы вы показать мне, как вы это сделаете? –

0

Проблема у Вас есть это scoping вопрос.

leftLightSeries определен в рамках функции scan(), что означает, что доступ к ней возможен только из этой функции. Поэтому он недоступен в рамках функции printResults().

Еще одна проблема с вашим кодом является то, что у вас есть несколько return заявления, которые никогда не будут достигнуты:

return leftLightSeries 
return centerLightSeries 
return rightLightSeries 

Этот блок кода будет возвращать leftLightSeries, а затем никогда не достигают следующих двух return заявления. Один из вариантов можно рассмотреть, если хочет вернуть несколько значений будет возвращать кортеж:

return (leftLightSeries, centerLightSeries, rightLightSeries,) 

Тогда в printResults() вы могли захватить ваш ряд так:

leftSeries, centerSeries, rightSeries = scan() 

for index in range(0,6): 
    print str(index) + " " + str(leftSeries[index]) + " " + str(centerSeries[index]) + " " + str(rightSeries[index]) 

Кроме того, обратите внимание, что range(0,6) является то, что вы хотите вместо диапазона (1,6). Массивы начинаются с индекса 0 и range дают диапазон от первого аргумента до, но не включая второй аргумент.

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