答案应该是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)
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)
| 归档时间: |
|
| 查看次数: |
48647 次 |
| 最近记录: |