Python全局变量-未定义?

Axi*_*oms 2 python debugging global-variables pandas

我遇到了一个问题,在2个不同的函数中修改了全局变量后,该变量没有被“记住”。该变量df应该是数据帧,在用户加载正确的文件之前,它不会指向任何内容。这类似于我拥有的东西(使用pandastkinter):

global df

class World:

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

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

    def save(self):
        ....
        df = df.append(...)
Run Code Online (Sandbox Code Playgroud)

save()总是被称为load()。问题是,当我调用时save(),出现了“ df未定义” 的错误。我以为已df在中进行了初始分配init(),然后在中进行了“更新” load()?我在这里做错了什么?

raG*_*Sri 9

对于使用 python3 来到这里的任何人 - 尝试使用非本地而不是全局 - python3 中引入的新构造,允许您在本地范围内改变和读取全局变量


Viv*_*gan 6

您必须global在函数内部而不是外部使用关键字。df您在函数中定义的所有内容都是本地范围的。这是正确的方法——

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(...)
Run Code Online (Sandbox Code Playgroud)


Pat*_*ner 6

您必须global df 需要修改全局变量的函数使用。否则(如果要写入),您将在函数内部创建一个具有相同名称的局部范围的变量,并且您所做的更改不会反映到全局变量中。

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)
Run Code Online (Sandbox Code Playgroud)

输出:

bla   # global

print from func: bla    # readonly global

local variable 'p' referenced before assignment  # same named local var confusion

bla    # global
blubb  # changed global
Run Code Online (Sandbox Code Playgroud)