函数的作用域
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 作者:闻骏