python函数作用域

python的变量作用域

# 1、作用域即范围 - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效   
# - 局部范围(局部名称空间属于该范围):临时存活,局部有效 
# 2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关
# LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
# locals 是函数内的名字空间,包括局部变量和形参
# enclosing 外部嵌套函数的名字空间(闭包中常见)
# globals 全局变量,函数定义所在模块的名字空间
# builtins 内置模块的名字空间
name = 'ajune globals'  # globals


def fun():
    name = 'ajune enclosing'  # enclosing

    def fun1():
        name = 'june locals'  # locals
        print(name)

    return fun1()


fun() #  结果是 june locals
fun()  # 将name = 'june locals'注释掉后,结果是ajune enclosing
fun()  # 将name = 'june locals'和name = 'ajune enclosing'注释掉后,结果是ajune globals

当要使用内部函数与外部函数之间的变量时,可以通过关键字nonlocal来使用变量

def fun():
    name = 'ajune enclosing'  # enclosing
    print(name, id(name))
    
    def fun1():
        nonlocal name  # locals
        print(name, id(name))

    return fun1()


fun()

通过id()可以看到fun1()函数使用的name 还是属于enclosing层的。那如果想使用global层的变量呢?在使用的时候通过global关键词使用。并且通过这种方式还可以在内部函数内修改外部的变量。对于列表就不要这样了,列表属于全局变量,在函数内部可以直接使用。

原文地址:https://www.cnblogs.com/June-King/p/10596208.html