变量的“作用域”,是指该变量能够起作用的范围,也就是它在什么范围内是有效的。Python的变量根据它起作用的范围,会有3种作用域。
1.局部作用域
自己编写的程序段和函数中创建的新变量,离开了这个范围就会结束自己的生命期,这种变量称为局部变量,它的作用域称为“局部作用域”。
(1)局部变量
作用范围是从函数定义开始,到函数执行结束。局部变量定义在函数內,只能在其被声明的函数内部访问,即使它与函数外具有相同名称的变量没有任何关系。
def fun1():
x = 10 # x 的作用域仅限于fun1 函数内部
print(x)
例如以上函数中x变量就是局部变量,这个变量x只可以在我们定义的fun1函数中使用,其他任何地方都无法使用这个变量x。
fun1() # 输出: 10
2.全局作用域
在一个程序文件中,会有多个程序块和函数。在它们外面创建的变量,文件的诸多程序块和函数都可以使用,这种变量称为全局变量,它的作用域称为全局作用域。
(1)全局变量
全局变量是在函数外定义的变量,它在当前程序中任何位置都可以被访问。
x = 100 # x 的作用域是全局的,可以在任何地方访问
def fun2():
print(x) # 访问全局变量 y
以上示例中我们在fun2函数外部定义了一个变量x,此时在fun2函数内部使用变量x,打印了x的值。这里的x就是全局变量。
(2)修改全局变量
在开发中经常用到的场景就是调用某个函数后会改变某个全局变量的值。改如何修改呢,我们一起来看一下,这里主要使用了一个关键字 global。代码如下:
x = 100 # x 的作用域是全局的,可以在任何地方访问
def fun2():
global x # 指明 x 是全局变量
x=x+1
print(x) # 访问全局变量 y
我们一下流程来测试下效果:
(1)直接通过print函数输出全局变量x的值
(2)我们调用fun2函数后再调用prin(x)输出一下全局变量x的值
# 没调用函数fun2之前输出全局变量x的值
print(x) #100
fun2() #调用函数, 输出: 101
print(x) # 调用函数后输出全局变量x的值101
```
答案估计你已经猜到了,调用fun2函数后,全局变量x的值被修改了。结果如下:
100
101
101
在上一节的部分中讲解嵌套函数时留下了一个小问题,我们现在再来看一下。
def outerFun():
x = 10
def innerFun():
x = 20
print("Inner:", x)
innerFun()
print("Outer:", x)
outerFun()
就是这程序,如何让innerFun函数修改外部函数x的值呢?
其实修改很简单,也是用了一个关键字nonlocal。
nonlocal是Python中用于在嵌套函数中修改外层函数局部变量的关键字,主要用于解决闭包函数中变量作用域的问题。
def outerFun():
x = 10
def innerFun():
nonlocal x # 声明 x 为非局部变量
x = 20
print("Inner:", x)
innerFun()
print("Outer:", x)
outerFun()
看看程序的运行结果:
Inner: 20
Outer: 20
我们发现外部函数变量x的值已经内部函数改掉了,这就是nonlocal的功劳。
3.内置作用域
内置函数是系统提供给Python所有程序块和函数共用的,因此它们提供的变量会自动地被不同文件所使用,这种变量的作用域称为内置作用域。包含了所有内置函数和异常等。例如,print()、len()、list()等。
例如:统计字符串的长度。
len("Hello") # 返回5