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?
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