python 中全局变量和局部变量在使用过程中的一个容易出错的地方
什么是全局变量
python中,在函数外部声明的变量可以叫做全局变量。
x = 10
def fn1():
pass
fn1()
什么是局部变量
python中,在函数内部声明的变量通常情况下称之为局部变量,它的作用域也仅限在函数内部。
x = 10 # 全局变量
def fn1() :
y = 20 # 局部变量,只能够在函数内部中使用
fn1() # 调用函数
容易出错的一个点
在使用全局变量和局部变量的过程中,有一种情况十分容易出错:
x = 10
def fn1() :
print(x)
fn1()
上面这段代码,主要是在函数fn1中调用了全局变量x ,那么当函数调用的时候,输出的结果为10
x = 10
def fn1():
x = 20
print(x)
fn1()
print(x)
上面这段代码的输出结果为20、10,函数内部的print()输出的是函数内部的局部变量x,所以输出结果为20,而在函数外部使用print输出的结果为10,因为此时调用的是全局变量x,所以输出为10
再来继续看下面这段代码:
x =10
def fn1():
print(x)
x = 20
fn1()
一旦上面的这段代码执行,程序看似没什么问题,但是实际却会抛出一个错误,UnboundLocalError: local variable 'x' referenced before assignment.
出现错误的原因是因为,全局变量在函数中只能够查询,但是却不能够修改。一旦修改就会报错。
再来看刚才的一段代码:
x = 10
def fn1():
x = 20
print(x)
fn1()
print(x)
为什么这段代码没有报错呢?原因其实很简单,因为在这段代码中,函数外部的全局变量x值为10,但是在函数内部,第一句代码就是重新的创建了一个变量x,值赋值为20,这个时候函数内部的x作用域是局部的,仅限于函数内部,而函数外部的x是全局的,作用域为全局。
在函数内部的代码中,print()还没有输出前,就重新声明了个变量x,所以后面print输出的x,应该为局部变量x。
而刚才抛出错误的代码中是先使用的print输出,而此时输出的x为全局变量x,所以之后x = 20会抛出错误,因为python会认为,此时你不是单独的创建一个局部变量而是在修改全局变量,这一点是python不允许的。
Tip:全局变量在函数中只能够查看而不能够修改。