python中全局变量和局部变量的一个小坑

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:全局变量在函数中只能够查看而不能够修改。

上一篇:对Faster R-CNN的理解(2)


下一篇:java和C#中 定义变量,加一个小括号是什么意思。。。