Python的全局变量和局部变量
局部变量:定义在函数内部的变量称为局部变量,他的作用域范围为函数内,也就是出了函数外就无效。举个简单的例子:葫芦娃在国内基本大家都认识他,大家一看到他就会知道,咦,那是葫芦娃。但是一旦出了国外,就没有人认识他了,葫芦娃的作用域范围为国内。
全局变量:定义在函数外的变量称之为全局变量,他的作用域范围为全局。再举个例子:如果把函数比作国家,那么全局就是全球,全局变量就像是阿拉伯数字,你去到哪,大家都认识。
由上面的定义可以看出,所谓的全局变量跟局部变量主要是针对函数内外而言的。
我们接下来举个简单的例子说明全局变量跟局部变量在实际应用中的区别:
a = "python" # 函数外定义的a为全局变量 def func1(): print (a) def func2(): b = "小黑屋" # 函数内定义的b为局部变量 print (b) func1() # 执行函数func1 func2() # 执行函数func2 print(b) # 输出函数func2中的局部变量b >>python # 函数func1执行后输出全局变量a >>小黑屋 # 函数func2执行后输出局部变量b # 在函数外输出局部变量b,出现了未定义的报错 Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> print(b) NameError: name 'b' is not defined
由上面的例子可以看出,局部变量只能在函数内部使用,而全局变量是全局范围内都能引用。
但如果在函数内定义了一个跟全局变量一样名字的变量,这时候会怎样呢?请看例子:
a = "python" def func1(): a = '小黑屋' print (a) def func2(): print(a) func1() func2() print (a) >>小黑屋 >>python >>python
由上可知,当你在函数内定义一个与全局变量一样名字的变量时,相当于你在函数内重新定义了一个局部变量,为什么这样说呢,因为你会发现,你在函数内重新定义这个变量后,无论你在函数内怎样改动这个函数的值,只有在函数内生效,对全局来说是没有任何影响的。也可以从侧面推测出,函数内定义的局部变量优先级大于全局变量。
既然全局变量这么好用,那我们在函数中就可以随意的使用全局变量了吧?真的是这样吗?
a = 6 # 定义全局变量a def func(): a = a * 3 print (a) func() >>Traceback (most recent call last): File "<pyshell#26>", line 1, in <module> func() File "<pyshell#25>", line 2, in func a = a * 3 UnboundLocalError: local variable 'a' referenced before assignment a = a * 3 print (a) >>18
咦,函数内的操作怎么报错了,函数外的同样的操作怎么就没有报错?什么鬼?原来,在python的函数中=号左边表示定义了一个局部变量,待赋值,而上面的例子中就相当于你定义了一个局部变量a,但你还没赋值就拿来进行运算,自然就会报错了。所以,全局变量中在函数中使用的时候也要注意下避免出现这样的情况,你要拿来运算的时候完全可以再定义另外一个变量如b = a*3 这样就完全没问题了。
上面我们举了葫芦娃的例子,或许有人会说,你举的例子不够全面,我们国内也有像成龙这样的巨型走到了全球,全世界都认识他。那我们函数内是否也会有这样的定义呢?能够出现全局变量?我们继续看例子:
def func(): global a # 利用global关键词定义全局变量 a = "python小黑屋" print (a) print(a) >>NameError: name 'a' is not defined # 你在逗我吗?报错了? func() print (a) # 咦,怎么又不报错了 >>python小黑屋 >>python小黑屋
大家可能会感到奇怪,为什么我在函数内定义了一个全局变量,但是第一次打印的时候确报错,但在执行了函数func()之后又不报错了呢?
首先,Python在函数中定义全局变量的关键字为global,加了global就是全局变量了,但是用global定义全局变量的时候不能同时赋值,要在下一行才能赋值。其次,在函数中定义了全局变量后,要这个函数执行了,全局变量才生效,就像你很才,但不展示出来谁知道你有才(也就你自己知道了)。
这个时候,可能又有人有问题要提问了,如果我在函数func1()中定义一个局部变量a,然后在函数func1()中再写一个函数func2(),那我在func2()中可以引用func1()的a吗?事实上是可以的。
def func1(): a = "python小黑屋" def func2(): print (a) return func2() func1() >>python小黑屋
其实这就像函数引用全局变量一样,函数也可以引用上一级函数的变量。但同理,直接在=左边重定义的变量的话就会又报错。但是,python3不知为何提供了一个方法,可以使你直接引用又不会报错:
def func1(): a = "python小黑屋" def func2(): nonlocal a # 使用nonlocal不是局部变量 a = a * 3 # 这个是上次字符串忘记说的,字符串*数字是重复字符串 print (a) return func2() func1() >>python小黑屋python小黑屋python小黑屋
只要你使用了关键字nonlocal他就能获取你上一级函数的局部变量a,获取不到就再获取上一级函数的变量a,当然,只限函数外,如果最外面的函数也还是没有的错,那就会报错了。
这个技能的好处应该是如果你内层函数需要引用到外部函数的局部变量时不用再定义一次,能节省点系统资源吧。
原文链接:https://blog.csdn.net/zhaogeno1/article/details/80298702