Python本地变量和全局变量

4
def spam():
    print(eggs)
    eggs = 13

eggs = 12
spam()

出现以下错误:

UnboundLocalError: 引用未初始化的本地变量 'eggs'

但是这个例子没有出错:

def spam():
    print(eggs)


eggs = 12
spam()

为什么?


因为第一个版本包含对eggs的赋值,所以它被认为是一个局部变量。第二个版本没有对eggs的赋值,因此它被认为是一个全局变量。 - khelwood
原因是,你不希望 eggs 在第一个函数的中途突然从全局变量变成局部变量;而且你也不希望它在没有声明意图的情况下默默地修改全局变量。 - alexis
可能是Python变量作用域错误的重复问题。 - sanyassh
1个回答

2
在第一个例子中,当你执行eggs = 13时,函数尝试在其范围内查找定义,将其视为局部变量,并且由于函数内没有定义这样的变量,因此会抛出local variable 'eggs' referenced before assignment.异常。
在第二个例子中,由于没有这样的赋值语句,eggs从全局范围内获取,即eggs=12,因此这里不会抛出任何异常。
要解决此问题,您需要在函数内分配一个局部变量eggs。仅在此处引用和更改局部变量eggs,全局变量eggs保持不变。原始答案被翻译成“最初的回答”。
In [40]: def spam(): 
    ...:     eggs = 12 
    ...:     print(eggs) 
    ...:     eggs = 13 
    ...:     print(eggs) 
    ...:  
    ...: eggs = 12 
    ...: spam() 
    ...: print(eggs)                                                                                                                                                                
12
13
12

太好了!很高兴能帮助 :) 如果我的回答对您有帮助,请考虑点击答案旁边的勾号将其标记为已接受的答案@YashGupta。同时,建议您阅读https://stackoverflow.com/help/someone-answers和https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work。 - Devesh Kumar Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接