Search code examples
pythonpandasdebuggingglobal-variables

Python Global Variables - Not Defined?


I'm running into an issue where a global variable isn't "remembered" after it's modified in 2 different functions. The variable df is supposed to be a data frame, and it doesn't point to anything until the user loads in the right file. This is similar to something I have (using pandas and tkinter):

global df

class World:

    def __init__(self, master):
        df = None
        ....

    def load(self):
        ....
        df = pd.read_csv(filepath)

    def save(self):
        ....
        df = df.append(...)

save() is always called after load(). Thing is, when I call save(), I get the error that "df is not defined." I thought df got its initial assignment in init(), and then got "updated" in load()? What am I doing wrong here?


Solution

  • You have to use global df inside the function that needs to modify the global variable. Otherwise (if writing to it), you are creating a local scoped variable of the same name inside the function and your changes won't be reflected in the global one.

    p = "bla"
    
    def func():
        print("print from func:", p)      # works, readonly access, prints global one
    
    def func1():
        try: 
            print("print from func:", p)  # error, python does not know you mean the global one
            p = 22                        # because function overrides global with local name   
        except UnboundLocalError as unb:
            print(unb)
            
    def func2():
        global p
        p = "blubb"                       # modifies the global p
    
    print(p)
    func()
    func1()
    print(p)
    func2()
    print(p)
    

    Output:

    bla   # global
    
    print from func: bla    # readonly global
    
    local variable 'p' referenced before assignment  # same named local var confusion
    
    bla    # global
    blubb  # changed global