local variable xxx referenced before assignment

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44198436/article/details/100051651

在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

以上是我在编程中的理解,不足之处,恳请指出。

猜你喜欢

转载自blog.csdn.net/qq_44198436/article/details/100051651