2016-08-19 1 views
-1

Я просто написал код для декодирования чего-то. Когда я пробую небольшое количество, он работает хорошо. Однако, когда я пробую какое-то большое количество, это делает неправильный.«Локальная переменная« x », на которую ссылаются перед присвоением», когда данные становятся больше

Дело в то, что я хотел бы, чтобы расшифровать это: enter image description here

def decode(n): 
    if n == 0: 
     return (0, 0) 
    circle = int(sqrt(n)/2 + 0.5) 
    largest = (2 * circle + 1) ** 2 - 1 
    distance = largest - n 
    quotient = distance // (2 * circle) 
    remainder = distance % (2 * circle) 

    if quotient == 0: 
     x = circle- remainder 
     y = - circle 
    if quotient == 1: 
     x = -circle 
     y = -circle + remainder 
    if quotient == 2: 
     x = -circle + remainder 
     y = circle 
    if quotient == 3: 
     x = circle 
     y = circle - remainder 
    return (x, y) 

print(decode(2070)) #(23, 23)  
print(decode(204019576686482721392)) #(7141771, 7141771081) 
print(decode(142656302882002193830320)) 
#Traceback (most recent call last): 
# File line 51, in <module> 
# print(decode(142656302882002193830320)) 
# File line 47, in decode 
# return (x, y) 
#UnboundLocalError: local variable 'x' referenced before assignment 

Я также попробовал п от 1-14, все это результат правильно.

Я только что нашел причину, по которой я должен предоставить еще int() в sqrt (n).

circle = int(int(sqrt(n)/2) + 0.5) 

Спасибо всем.

+1

Так что такое значение 'quotient' там? – melpomene

+0

Если ваш коэффициент больше 3, вы не устанавливаете значение 'x'. Следовательно, вы получаете ошибку при попытке вернуть 'x'. –

+0

Спасибо, что напомнили. Я просто попробовал, чтобы коэффициент был равен 4, так что это причина, по которой возникает ошибка. Но почему фактор станет 4, я смущен. Пожалуйста, дайте мне больше советов. – Mangosteen

ответ

1

У вас возникли ситуации, когда ни одно из ваших операторов if не согласовано, поэтому, когда вы пытаетесь вернуть x, он не был определен. Вы должны указать x и y значения по умолчанию.

Вы должны также использовать пункты elif (else if), иначе каждый блок if необходимо будет проверить. Использование elif s означает, что после согласования инструкции остальные пропускаются; Он более эффективен и менее подвержен двум утверждениям, случайно совпадающим в одно и то же время.

def decode(n): 
    # either pre-define your default values... 
    x = 0 
    y = 0 

    if quotient == 0: 
     x = circle - remainder 
     y = - circle 
    elif quotient == 1: 
     x = -circle 
     y = -circle + remainder 
    elif quotient == 2: 
     x = -circle + remainder 
     y = circle 
    elif quotient == 3: 
     x = circle 
     y = circle - remainder 
    # ...or define your defaults in an else clause 
    else: 
     x = 0 
     y = 0 

    return (x, y) 
+0

Спасибо, но есть ли какой-либо возможный способ отладки, почему значение quotient будет из моего ожидания, когда ввод станет большим. – Mangosteen

+0

Это не форум, вы должны задать новый вопрос. – Soviut

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