4.4 Python3 进阶 - 变量作用域

>>返回主目录


image

源码

# 变量作用域
a_test_1 = 1  # 全局变量


def scope_demo():
    # print(f'函数内初始a_test_1的值是:{a_test_1}')
    a_test_1 = 2  # 局部变量
    b_test_1 = 4  # 局部变量
    b_test_1 = a_test_1 + b_test_1  # 修改局部变量的值
    print(f'函数内a_test_1的值是:{a_test_1}, 函数内b_test_1的值是:{b_test_1}')


scope_demo()
print(f'函数外a_test_1的值是:{a_test_1}')
# print(f'函数外b_test_1的值是:{b_test_1}')

image

源码

# 外部嵌套函数(Enclosing) & 内建(Built-in)作用域
# 闭包函数
a_test_4 = 100


def outer_fun_4():
    a_test_4 = 20

    def inner_fun_1():  # 不是闭包函数
        a_test_4 = 40
        print(f'内函数1中a_test_4的值是:{a_test_4}')
        
        def inner_fun_2():  # 闭包函数
            print(f'内函数2中a_test_4的值是:{a_test_4}')
        print('判断闭包2', inner_fun_2.__closure__)
        inner_fun_2()  # 调用内部函数
    inner_fun_1()  # 调用内部函数
    print('判断闭包1', inner_fun_1.__closure__)
    print(f'外函数4内a_test_4的值是:{a_test_4}')
    
    
outer_fun_4()
print(f'函数外a_test_4的值是:{a_test_4}')
# 判断闭包函数方法:函数名.__closure__ 在函数是闭包函数时,返回一个cell元素;不是闭包时,返回None
# print(inner_fun_2.__closure__ )  # 与调用该函数缩进相同,无法直接调用内部函数

源码

# 内建作用域
def outer_fun_5():
    max = 10
    
    def inner_fun_1():
        max = 20
        print(f'内函数1中a_test_4的值是:{max}')  # 使用局部变量20
    inner_fun_1()
    
    
outer_fun_5()
print(f'函数外max的值是:{max}')  # 内建作用域

源码

# 变量作用域总结
v = 100  # 全局作用域


def outer_fun_6():
    v = 200  # 外部嵌套函数作用域
    print(f'访问外部函数的局部变量v:{v}')
    
    def inner_fun():
        # v = 300  # 局部作用域
        max = 3
        print(f'访问内部函数的局部变量v:{v}')
        print(f'访问内部函数的局部变量max:{max}')  # 内置模块的作用域可以在其余三个作用域重新创建
    inner_fun()
    
    
outer_fun_6()
print(f'访问全局变量v:{v}')
print(f'访问内置函数作用域的变量max:{max}')  # 内建作用域

源码

# 修改作用域变量:global和nonlocal
# global的使用,例如:
a_test_2 = 10  # 全局变量


def change_scope_demo():
    global a_test_2  # 使用global关键字声明全局变量
    a_test_2 = 2
    print(f'修改后函数内a_test_2的值是:{a_test_2}')


change_scope_demo()
print(f'函数外a_test_2的值是:{a_test_2}')

# nonlocal的使用(适用嵌套函数内部,无法修改全局变量),例如:
a_test_3 = 100


def outer_fun():
    # global a_test_3  # 如果在外函数内,声明了全局变量,那么使用nonlocal关键字声明内函数变量时,就无法找到外函数内的局部变量,会报错
    a_test_3 = 20

    def inner_fun_1():
        nonlocal a_test_3
        print(f'在内函数中a_test_3的值是:{a_test_3}')
        a_test_3 = 10
        print(f'修改后内函数a_test_3的值是:{a_test_3}')

    inner_fun_1()  # 调用内部函数
    print(f'外函数内a_test_3的值是:{a_test_3}')


outer_fun()
print(f'函数外a_test_3的值是:{a_test_3}')

源码

# 作用域变量集合:globals()
# 全局变量
python_name = 'Python之路'
python_url = 'https://www.cnblogs.com/PortosHan/'


def learn_python():
    # 局部变量
    python_name = 'Python目录'
    python_url = 'https://www.cnblogs.com/PortosHan/p/14449208.html'
    
    def python_1():
        python_name_1 = 'Python3基础-前言'
        python_url_1 = 'https://www.cnblogs.com/PortosHan/p/14462299.html'
        print('inside     call:', globals())  # 内函数中调用
    print('out-inside call:', globals())  # 外函数中调用
    return python_1()


print('outside    call:', globals())  # 函数外调用
learn_python()

源码

# 访问指定全局变量
print(f'访问python_name的值是:{globals()["python_name"]}')
print(f'访问python_name的值是:{globals().get("python_name")}')
# 修改全局变量中的值,全局变量会被修改
globals()["python_name"] = 'Learn Python'
print(f'全局变量python_name修改后的值是:{python_name}')

源码

# 变量作用域集合:locals()
# 全局变量
python_name = 'Python之路'
python_url = 'https://www.cnblogs.com/PortosHan/'


def learn_python():
    # 局部变量
    python_name = 'Python目录'
    python_url = 'https://www.cnblogs.com/PortosHan/p/14449208.html'
    
    # 修改局部变量中的值,不会被修改
    locals()["python_name"] = 'Learn Python'
    print(f'局部变量python_name修改后的值是:{python_name}')
    
    def python_1():
        python_name_1 = 'Python3基础-前言'
        python_url_1 = 'https://www.cnblogs.com/PortosHan/p/14462299.html'
        print('inside     call:', locals())  # 内函数中调用
    print('out-inside call:', locals())  # 外函数中调用
    return python_1()


print('outside    call:', locals())  # 函数外调用
learn_python()

源码

# 访问指定变量
print(f'访问python_name的值是:{locals()["python_name"]}')
print(f'访问python_name的值是:{locals().get("python_name")}')

# 修改全局变量中的值,可以被修改,同globals()
locals()["python_name"] = 'Learn Python'
print(f'全局变量python_name修改后的值是:{python_name}')

源码

# 变量作用域集合:vars()
# 全局变量
python_name = 'Python之路'
python_url = 'https://www.cnblogs.com/PortosHan/'


class LearnPython:
    # 局部变量
    python_name = 'Python目录'
    python_url = 'https://www.cnblogs.com/PortosHan/p/14449208.html'

    def python_1(self):
        self.python_name_1 = 'Python3基础-前言'  # self对象内属性
        python_url_1 = 'https://www.cnblogs.com/PortosHan/p/14462299.html'  # 局部变量
        print('inside     call1:', vars())  # 函数中调用
        print('inside     call2:', vars(LearnPython))  # 函数中调用
    print('out-inside  call:', vars())  # 类中调用


print('outside    call1:', vars())  # 类外调用
print('outside    call2:', vars(LearnPython))  # 类外调用
LearnPython().python_1()  # 创建实例,调用函数

源码

# 访问指定object内的变量
print(f'访问python_name的值是:{vars(LearnPython)["python_name"]}')
print(f'访问python_name的值是:{vars(LearnPython).get("python_name")}')

# 修改指定object内局部变量中的值,不可变的映射类型(mappingproxy)无法修改,会报错
# vars(LearnPython)["python_name"] = 'Learn Python'

# 修改全局变量中的值,可以被修改,同globals()
vars()["python_name"] = 'Learn Python'
print(f'全局变量python_name修改后的值是:{python_name}')

>>返回主目录

posted @ 2021-05-28 15:36  PortosHan  阅读(53)  评论(0编辑  收藏  举报