2016-08-19 7 views
-1

Ich habe gerade einen Code geschrieben, um etwas zu entschlüsseln. Wenn ich eine kleine Nummer versuche, funktioniert es gut. Wenn ich jedoch eine große Zahl versuche, wird ein Fehler ausgegeben."lokale Variable 'x' vor Zuweisung referenziert" wenn Daten größer werden

Das Ding, was Ich mag würde, ist diese entschlüsseln: 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 

Ich habe auch versucht, n 1 bis 14, die alle das Ergebnis richtig ist.

Ich habe gerade den Grund gefunden, dass ich eine weitere int() in sqrt (n) bereitstellen sollte.

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

Danke an alle.

+1

Also was ist der Wert von 'Quotienten' dort? – melpomene

+0

Wenn Ihr Quotient größer als 3 ist, wird der Wert von "x" nicht festgelegt. Daher erhalten Sie den Fehler, wenn Sie versuchen, 'x' zurückzugeben. –

+0

Danke für Sie erinnern. Ich habe gerade versucht, dass der Quotient 4 ist, also ist das der Grund, warum es einen Fehler gibt. Aber warum Quotient wird 4, ich bin verwirrt. Bitte gib mir weitere Hinweise. – Mangosteen

Antwort

1

Sie haben eine Situation, in der keine Ihrer if-Anweisungen übereinstimmen. Wenn Sie also versuchen, x zurückzugeben, wurde es nicht definiert. Sie sollten die Standardwerte x und y angeben.

Sie sollten auch elif (sonst wenn) -Klauseln verwenden, andernfalls muss jeder if Block überprüft werden. Mit elif s bedeutet, dass nach dem Übereinstimmen einer Anweisung der Rest übersprungen wird. Es ist effizienter und weniger anfällig für zwei Aussagen, die versehentlich gleichzeitig übereinstimmen.

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

Danke, aber gibt es einen möglichen Weg zu debuggen, warum der Quotientenwert außerhalb meiner Erwartungen liegt, wenn die Eingabe groß wird. – Mangosteen

+0

Dies ist kein Forum, Sie sollten eine neue Frage stellen. – Soviut

Verwandte Themen