问题
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?
回答1:
Yo have to use global df
inside the function that needs to modify the global variable. Else (if writing to it) you are creating a local scoped variable of the same name inside the function and your changes wont be reflected to 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
回答2:
You have to use the global
keyword inside the function rather than outside. All the df
that you have defined inside your function are locally scoped. Here is the right way -
df = pd.DataFrame() # No need to use global here
def __init__(self, master):
global df # declare here
df = None
....
def load(self):
global df # declare here
....
df = pd.read_csv(filepath)
def save(self):
global df # declare here
....
df = df.append(...)
来源:https://stackoverflow.com/questions/49715854/python-global-variables-not-defined