函数的作用域


01.标识符的可见范围,就是标识符的作用域,即变量的作用域。

  • 在函数内定义的变量称为本地变量(local),本地变量只能在函数内部使用,比如:
x = 5

def outer(x):
    def inner():
        print("local variable y is {}".format(y))
    y = 10
    print("local variable x is {}".format(x))
    inner()

print("global variable x is {}".format(x))
outer(30)
  • 函数内部可以使用函数外部的变量,嵌套函数中内层函数可以使用外函数层定义的变量。
  • 函数内部的变量在函数执行完毕之后即被销毁。
  • 在函数外定义的变量称为全局变量(global),全局变量在函数内可见。
    • 若在函数内使用与全局变量一致的变量名时,等于重定义变量,需要等别注意x += 1之类的定义语句。
  • 函数作用域的示例:
x = 5

def calc():
    print(x)
    x += 1

calc()
  • 以上代码会报错,x=5是全局变量,但当执行到x+=1时,实际上已经重定义了一个局部变量。
  • 变量赋值之前需要先定义,因此x+=1会先执行x+1,在定变量义之前先赋值,因此会报错。


02.在函数内使用global关键字定义的变量称为全局变量,全局变量的作用域包含函数内部、外部。

  • 全局变量在函数中的声明应在函数中该变量的赋值、调用之前完成。
  • 全局变量的作用域是全局性的,即在函数内部对该变量的赋值,亦会影响到函数外部该变量的值,比如:
x = 10

def calc():
    global x
    x += 1
    print(1, x)

calc()
print(2, x)
  • global关键字只能针对全局变量,如变量的作用域不是全局(比如外层函数中定义的变量),则会抛出异常,比如:
y = 10

def outer():
    x = 10
    def inner():
        global x
        x += 1
        print(2, x)
    print(1, x)
    inner()

outer()
print(3, y)
  • 函数的目的是为了封装隔离,因此并不建议使用全局变量,而建议通过传参的方式赋值。
  • 全局变量通常作为常量或公共变量使用。


03.在函数内使用nolocal关键字可以定义一个非本作用域变量,表示该变量不是在当前的函数中定义的。

  • nolocal表示申明的变量可以从其外层函数中获取,但不能从全局作用域中获取。
  • nolocal的示例:
def outer(x):
    def inner():
        nonlocal x
        x += 1
        print(2, x)
    print(1, x)
    inner()

outer(10)
  • 当执行outer(10)时,等于显示的传递了x=10这个参数,即函数outer中定义了x=10这个局部变量。
  • 当执行inner()时,nonlocal会从外层函数outer中寻找x这个变量。
文档更新时间: 2020-09-20 17:19   作者:闻骏