为什么我在赋值错误之前得到一个引用的局部变量?

Dr.*_*020 1 python

答案应该是2因为首先main()调用该函数,然后调用该first()函数,覆盖在任何函数之外定义的全局变量num = 0,从而将其变为具有全局范围的变量.但是我收到以下错误:

UnboundLocalError: local variable 'num' referenced before assignment  
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?

def first():
    num = num + 1

def main():
    num = 1
    first()
    print(num)

num = 0

num_result = main()

print(num_result) 
Run Code Online (Sandbox Code Playgroud)

Jon*_*fer 9

OP写道(强调我的):

答案应该是2,因为首先调用main()函数,然后调用first()函数,覆盖全局变量.

它不会覆盖全局变量.除非您将变量明确指定为全局变量,否则如果函数中的变量有任何赋值,则假定它是本地变量.另请参阅python教程,了解如何定义函数(强调我的):

更确切地说,函数中的所有变量赋值都将值存储在本地符号表中; 而变量引用首先在本地符号表中查找,然后在封闭函数的本地符号表中查找,然后在全局符号表中查找,最后在内置名称表中查找.因此,全局变量不能直接在函数内赋值(除非在全局语句中命名),尽管可以引用它们.

声明文档global(如果有人使用Python 3正在研究这个,请同时看一下(比较global)非常有用的nonlocal声明及其PEP 3104).

要"修复"您的代码:

def first():
    global num
    num = num + 1

def main():
    global num
    num = 1
    first()
    print(num)

num = 0

num_result = main()

print(num_result) 
Run Code Online (Sandbox Code Playgroud)

请不要以这种方式使用全局变量.@LutzHorn在他的回答中表明了如何正确行事.

避免全局变量的原因是它们的效果难以测试,并且一旦代码变得足够复杂,很难推理.如果每个函数都修改了全局变量而不是正确地获取参数和返回值,那么只要一个函数与它的距离超过一周左右,理解代码实际执行的操作就很难了.


小智 6

里面first,num不得而知.使用参数和return语句.

def first(num):
    return num + 1

def main():
    num = 1
    num = first(num)
    return num

num = 0

num_result = main()

print(num_result)
Run Code Online (Sandbox Code Playgroud)

  • 应该不知道吧?因为 num = 0 是用全局作用域定义的,那么为什么不在 first() 函数内部定义它呢? (3认同)
  • 你在函数之外调用num变量是什么,如果不是全局的,它是什么? (2认同)