谈函数不得不谈有一下变量的作用域。因为所谓的变量作用域是对于函数而言的。如果你整个文件的代码没有任何函数,那么都是同一个作用域,但是如果有函数,那么就有了作用域的概念了。

在 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

我们可以看到,通过函数的调用,改变了全局变量的值。