函数 -- 变量作用域

  • 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/elsetry/exceptfor/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 -

你可能感兴趣的:(函数 -- 变量作用域)