Kieran Lavelle
Kieran Lavelle

Reputation: 446

Global variable x is not defined

Now here is my issue, this is my code located below. This program finds the roots of a number of the users choice. My issue is when I run this code I get, NameError: global name 'x' is not defined. It is coming from the main function when the value x is first encountered. I assume the same will happen to all of the other value's so basically what I am wondering is will I have to define these values outside of the ValueGrabber function? Or can I keep it how it is and just change it a bit?

def ValueGraber():
    x = input("What number do you want to find the root of?:  ")
    root = input("Which root do you want to find?:  ")
    epsilon = input("What accuracy do you want the value to be to? e.g 0.01 :  ")
    high = float(x) + 1
    low = 0.0
    ans = (high + low)/2.0
    Perfect = None
    return x, root, epsilon, ans, high, low, Perfect

def RootFinder(x, root, epsilon, ans, high, low):
    while (ans**float(root)-float(x)) > epsilon and ans != float(x):
        if ans**float(root) > float(x):
        ans = high
        else:
        ans = high
            ans = (high + low)/2.0
    return ans

def PerfectChecker(ans, x, root, Perfect):
    if round(ans, 1)**float(root) == x:
        Perfect = True
    else:
        Perfect = False
    return Perfect

def Output(ans, x, root, perfect, epsilon):
    if Perfect == True:
        print("The number {0} has a perfect {1} root of    {2}".format(float(x),float(root),float(ans)))
    else:
        print("The root of the number {0} has a {1} root of {2} to an accuracy of {3}".format(float(x),float(root),float(ans),float(epsilon)))

def main():
    InputData = ValueGraber()
    DataOpp = RootFinder(x, root, epsilon, ans, high, low)
    PCheck = PerfectChecker(ans, x, root, Perfect)
    DataOutput = Output(ans, x, root, Perfect, epsilon)

main()

Upvotes: 1

Views: 1828

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1121386

In main you refer to x but never defined it.

Your ValueGraber() function does return a value x but that name is not then automatically available to the caller.

The names in the main() function are local; they don't automatically reflect the names returned from the functions in any case. Here is a fixed main function that just happens to use the same names as the functions for returned values:

def main():    
    x, root, epsilon, ans, high, low, PerfecutData = ValueGraber()
    ans = RootFinder(x, root, epsilon, ans, high, low)
    Perfect = PerfectChecker(ans, x, root, Perfect)
    Output(ans, x, root, Perfect, epsilon)

I removed DateOutput; it'll always be None because Output() doesn't return anything.

You can still use different names in main; DataOpp is a perfectly valid local name (even though I personally would use lower_case_with_underscores style for local names, always), but you then should not expect ans to exist, you'd use DataOpp everywhere in main instead.

Upvotes: 3

Related Questions