更新时间:2021-11-12 来源:黑马程序员 浏览量:
Python变量并不是在哪个位置都可以访问的,具体的访问权限取决于变量定义的位置,其所处的有效范围视为变量的作用域。根据作用域的不同,变量可以划分为局部变量和全局变量。本节将针对局部变量和全局变量进行详细地讲解。
1.局部变量
在函数内部定义的变量称为局部变量,局部变量只能在定义它的函数内部使用。
例如,定义一个包含局部变量count的函数test(),在函数的内部和外部分别访问变量count,代码如下:
def test(): count=0 #局部变量 print (count) #函数内部访问局部变量 test() #函数外部访问局部变量 print(count)
执行程序,程序执行的结果如下:
0 Traceback (most recent call last): File "C:/Osers/admin/FycharmProjects/测试/func.py",line 6,in <module> print (count) NameError: name 'count' is not defined
以上程序在打印count的值之后又打印了错误信息“name 'count'is not defined”由此可知,函数中定义的变量在函数内部可使用,但无法在函数外部使用。
局部变量的作用域仅限于定义它的代码段内,在同一个作用域内,不允许出现同名的变量。
2.全局变量
全局变量是指在函数之外定义的变量,它在程序的整个运行周期内都占用存储单元。默认情况下,函数的内部只能获取全局变量,而不能修改全局变量的值。例如,将前面定义的test()函数进行调整,如下所示:
count - 10 #全局变量 def test(): count=11 #实际上定义了局部变量,局部变量与全局变量重名 print (count) test () print(count)
以上代码中首先在test()函数外定义了一个全局变量count,其次在该函数的内部尝试为count 重新赋值,然后在函数的内部访问了变量count,最后在执行完函数后访问变量count。
执行程序,程序执行的结果如下:
11 10
从以上结果可知,程序在函数test()内部访问的变量count为11,函数外部访问的变量为10。也就是说,函数的内部并没有修改全局变量的值,而是定义了一个与全局变量同名的局部变量。
在函数内部若要修改全局变量的值,需要提前使用保留字global进行声明,语法格式如下:
global 全局变量
对以上定义的test()两数再次进行调整,在该函数中对全局变量count进行修改,具体代码如下所示:
count = 10 #全局变量 def test (): global count #声明count为全局变量 count += 10 #函数内修改count 变量 print(count) test() print(count)以上代码首先定义了变量count并赋值为10,其次在test()函数内部使用global保留字声明count为全局变量,然后重新给count 变量赋值并将其输出,最后在函数执行完以后再次输出。
执行程序,程序执行的结果如下:
20 20
观察执行结果,程序在函数内部和外部获得的变量count的值均为20。由此可知,在函数内部使用关键字global对全局变量进行声明后,函数中对全局变量进行的修改在整个程序中都有效。
LEGB法则:
Python中的作用城大致可以分为以下4种。
(1)L(local):局部作用域。
(2)E(enclosing):嵌套作用域fo
(3)G(global):全局作用域。
(4)B(built-in):内置作用域。
基于LEGB法则,搜索变量名的优先级是:局部作用域>嵌套作用域>全局作用域>内置作用域。当函数中使用了未确定的变量名时,Python会按照优先级依次搜索4个作用域,以此来确定该变量名的意义。首先搜索局部作用域(L),其次是上一层函数的嵌套作用域(E),然后是全局作用域(G),最后是内置作用域(B)。接照LEGB原则查找变量,在某个区拔内若找到变量,则停止继续查找;若一直没有找到变量,则直接引发NameError异常。
猜你喜欢: