python中的全局变量与局部变量的区别

原文链接,点击打开!!

全局变量与局部变量的本质区别在于作用域:

全局变量是在整个py文件中声明的,全局范围内都能访问;

局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就会崩掉。

如果在函数内部定义某个与全局变量一样名称的局部变量,就可能导致意外的效果,不建议这样使用,这样会使程序不健全。

例1:

def fun(x):
    y=2
    print("乘法的运行结果:",x*y)

num1=1
print("初始num1=",num1)

fun(num1)

print("y的值是:",y)

运行结果:

初始num1= 1
乘法的运行结果: 2
Traceback (most recent call last):
  File "/home/python/Desktop/MX_Dynamic_Query_RTree2/test.py", line 18, in <module>
    print("y的值是:",y)
NameError: name 'y' is not defined

原因是:试图访问局部变量,但是访问的地方不在该变量y的作用域中,变量y是在函数内部定义的一个局部变量,所以该变量的作用域为该函数内部,在函数外部访问该局部变量y会报错!

例2:

def fun():
    num1 = 2
    print("函数内修改后num1=", num1)
num1 = 1
print("初始num1=", num1)
fun()

print("运行完函数后num1=", num1)

运行结果:

初始num1= 1
函数内修改后num1= 2

运行完函数后num1= 1

可以看到在函数内部对全局变量修改后,在函数执行完毕,修改的结果是无效的,全局变量并不会受到影响。

例3:

def fun():
    num1 *= 2
    print("函数内修改后num1=", num1)
num1 = 1
print("初始num1=", num1)
fun()

print("运行完函数后num1=", num1)

运行结果:

初始num1= 1
Traceback (most recent call last):
  File "/home/python/Desktop/MX_Dynamic_Query_RTree2/test.py", line 15, in <module>
    fun()
  File "/home/python/Desktop/MX_Dynamic_Query_RTree2/test.py", line 11, in fun
    num1 *= 2

UnboundLocalError: local variable 'num1' referenced before assignment

报错,这是因为在函数中使用了局部变量num1,它只是个跟全局变量同名的局部变量,使用前还是要赋值。

例4:如果真的想在函数体内修改全局变量的值,可以使用global关键字
def fun():
    global num1
    num1=2
    print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()  

print("运行完函数后num1=",num1)

运行结果:

初始num1= 1
函数内修改后num1= 2
运行完函数后num1= 2

使用global关键字就是告诉python编辑器,这个变量不是局部变量而是全局变量,其实有点像"引用"的意思。

例5:关键字nonlocal,字面意思是当前这个变量不是局部变量,它是python3.0中新增的关键字,python2.x中不支持。

def fun():
    num2 = 3
    def fun2():
        num2 *= 2
        print("num2=", num2)
    return fun2()

fun()  

报错!!错误的原因跟前面的差不多,就是使用了未定义的局部变量,然而num2也不是全局变量,只是fun2函数的外层变量,强行使用global定义num2的话同样会报错。

加上nonlocal关键字:

def fun():
    num2 = 3
    def fun2():
        nonlocal num2
        num2 *= 2
        print("num2=", num2)
    return fun2()
fun()

运行结果:num2= 6

猜你喜欢

转载自blog.csdn.net/MX_studying/article/details/80945607