函数 -- 变量作用域
2019-01-07 本文已影响0人
__深蓝__
- Python程序中,变量并不是在任何位置都可以访问,访问权限取决于变量在哪里赋值。
变量作用域
决定了什么位置可以访问什么变量。- 作用域一共有4种,分别是:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
- 以
L –> E –> G –>B
的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
x = int(2.9) # 内建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
模块(module)
,类(class)
、函数(def、lambda)
会引入新作用域if/elif/else
、try/except
、for/while
语句不会引入新作用域- 没有引入新作用域的变量,作用域外部也可以访问
- 引入新作用域
>>> def test():
... msg_inner = 'I am from Neuedu'
...
>>> msg_inner # 外部无法访问
NameError: name 'msg_inner' is not defined
- 没有引入新作用域
>>> if True:
... msg = 'I am from Neuedu'
...
>>> msg # 外部可以访问
'I am from Neuedu'
>>>
局部变量和全局变量
局部变量
是在函数内部定义的变量,只能在函数内部使用,在函数执行时被创建,执行结束后被系统回收全局变量
是在函数外部定义的变量,所有函数内部都可以使用,但是不允许直接修改全局变量的值
total = 0 # 这是一个全局变量
def sum( arg1, arg2 ):
total = arg1 + arg2 # total是局部变量.
print ("函数内是局部变量 : ", total)
return total
sum( 10, 20 )
print ("函数外是全局变量 : ", total)
函数内是局部变量 : 30
函数外是全局变量 : 0
global 和 nonlocal关键字
内部作用域修改外部作用域变量时,使用
global
关键字
num = 1
def fun1():
global num # 使用global关键字声明这是全局变量
print(num)
num = 123
print(num)
fun1()
print(num)
1
123
123
修改嵌套作用域中,外层非全局作用域的变量时,使用
nonlocal
关键字
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
100
100
- 为了保证所有的函数都能正确使用
全局变量
,应该将其定义在所有函数上方- 全局变量名前应该增加
g_
或者gl_
的前缀
- end -