在python中有一个经典错误:
local variable xxx referenced before assignment
#赋值前引用的局部变量xxx
这里引入两个概念:
局部变量指的在函数内部定义并使用的变量,它只在函数内部有效。
全局变量指的是能作用于函数内外的变量,即全局变量既可以在各个函数的外部使用,也可以在各函数内部使用。
Test_1:
def main():
num=5
print(num)
main()
print(num)
#NameError: name 'num' is not defined
这里是提示num没有被定义,因为num属于在main函数内部的变量,在函数体外面是不会被调用,解释器也不会认识这个num变量,只有当main函数调用时,才可以获得其内部一些变量,这就是局部变量。
def main():
global num
num=5
print(num)
main()
print(num)
使用global声明num为全局变量就可以了,但是应当注意,在项目中,定义全局变量会造成进程死锁
Test_2:
num=10
def main():
print(num)
num=5
print(num)
main()
print(num)
UnboundLocalError: local variable 'num' referenced before assignment
这就是赋前引用局部变量,num在main函数外界定义一次,但在main函数内部又定义一次,python将优先处理在函数体内的变量,且调用在定义之前,所以在第三行print(num)报错,后面num变量赋值num=5让num=10失去全局效果。
Test_3:
global num
num=10
def main():
print(num)
num=5
print('main:{}'.format(num))
main()
print(num)
声明num 为全局变量后,依然报错赋前引用局部变量,则就进一步说明在函数体内部自称一体,num为全局变量,只能保证在函数体内部认识这个num变量,但在函数体内部对num变量进行的改变,依然要保证先赋值后调用。
global num
num=10
def main():
#print(num)
num=5
print('main:{}'.format(num))
main()
print(num)
main:5
10
global num
num=10
def main():
#print(num)
#num=5
print('main:{}'.format(num))
main()
print(num)
main:10
10
num=10
def main():
global num
print(num)
num=5
print('main:{}'.format(num))
main()
print('外部:{}'.format(num))
10
main:5
外部:5
可以通过三个例子进一步总结。
Python 命名空间查找顺序:
假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。
如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:
NameError: name ‘runoob’ is not defined。
在实际运用中:
@app.route('/',methods=['GET','POST'])
def index():
if request.method == 'POST':
text='你好'
#return render_template('index.html',text=text)
return render_template('index.html',text=text)
在flask中text传入前端,就会报错local variable text referenced before assignment
解决方案就是取消注释那一句,讲最后一句text删除。
实际上这个错误可以归结于变量作用域问题,参考文章:
https://www.cnblogs.com/fireporsche/p/7813961.html
以上是我在编程中的理解,不足之处,恳请指出。