谈函数不得不谈有一下变量的作用域。因为所谓的变量作用域是对于函数而言的。如果你整个文件的代码没有任何函数,那么都是同一个作用域,但是如果有函数,那么就有了作用域的概念了。
在 Python 中主要的变量作用域有两种:
- 全局作用域,定义在函数外部的变量,其作用范围对于整个文件来说是全局的;
- 局部作用域,定义在函数内部的变量,其作用范围只对该函数有效,在函数以外不能使用该变量。
全局变量和局部变量
定义在函数外部,比如类、模块(注:一个 Python 文件就称为模块)。
# 定义两个全局变量 a,b
a = 1
b = 2
# 在函数中直接使用全局变量
def add():
print(a+b)
# 调用函数
add()
# 执行结果为 3
从上例中,定义的 a, b在函数的外部,我们就称之为全局变量。
如果某变量定义于函数内部,那么该变量只有函数内部的语句能使用,函数外部不能使用,那么这个变量就是局部变量。
def cirlce(r):
# 定义局部变量 pi
pi = 3.14
area = pi*r**2
return area
# 外部调用
print(pi)
# NameError: name 'pi' is not defined
通过上例,我们可以看到 pi 是在函数内部定义的,函数内部怎么折腾都可以,但是在函数外部调用就会告诉我们没有定义。
注意:函数参数也是局部变量。
局部变量对全局变量的屏蔽
当你在全局定义一个变量后,如果在函数中又定义了同名的变量,函数内部的变量会屏蔽掉全局变量。
# 定义全局变量
name = 'nemo'
def print_name():
# 定义同名的局部变量
name = 'jim'
print(name)
print_name()
# jim
# 调用函数后再检查全局变量
print(name)
# nemo
通过上例,我们可以看到,如果局部变量与全局变量同名,那么将会以局部变量为准,全局变量就被屏蔽了。
同时虽然函数内部给变量name
重新赋值了,但是全局变量 name 并没有变化。因为这已经是两个变量了。也就是说,在局部变量中想改变全局变量的值,这样是做不到的。
如果在某些情况下,我确实想通过函数调用全局变量怎么办?
用
global
关键字,告诉 Python ,我们在函数用的这个变量就是全局变量。
同样的
# 定义全局变量
name = 'nemo'
def print_name():
# 使用 global 指明使用全局变量
global name
name = 'jim'
# 调用函数后再检查全局变量
print(name)
# jim
我们可以看到,通过函数的调用,改变了全局变量的值。