day5·全局与局部变量

命名空间

命名空间是一个名称到对象之间的映射,字典格式。相同的命名空间是不能有重复名称(字典的特性key不重复) 。不同的命名空间是可以有重复名称

局部命名空间:函数中定义的名称、包含函数的参数、定义的变量及局部定义的变量

全局命名空间:模块中定义的函数、类、方法、变量等

内置命名空间:包含内建的关键字/变量等,例如我们导入的python库,os

访问:局部>全局>内置

作用域

可以访问命名空间的正文区域。 

全局变量

 定义在函数外部,为区分全局变量定义时变量名用GL_或gl_开头

可以在函数内部直接使用全局变量

如果要在函数内部修改全局变量分为两种情况

1.全局变量为可变类型,函数内部直接修改全局变量即可

2.全局变量为不可变类型,函数内部修改全局变量需要使用global关键字声明


gl_name = "p1"


class P1:
    def p1_func(self):
        # 直接使用全局变量
        print(f"我是{gl_name}")
        # print(p2.gl_name)


if __name__ == "__main__":
    P1().p1_func()

 


gl_name = "p1"


class P1:
    def p1_func(self):
        # 修改全局变量
        global gl_name
        gl_name = "mimi"
        print(f"我是{gl_name}")
        # print(p2.gl_name)


if __name__ == "__main__":
    P1().p1_func()   # 返回mimi
    print(gl_name)   # 返回mimi

 


gl_name = []


class P1:
    def p1_func(self):
        # 修改全局变量
        gl_name.append("123")
        print(f"我是{gl_name}")
        # print(p2.gl_name)


if __name__ == "__main__":
    P1().p1_func()
    print(gl_name)

闭包-访问外部函数变量

如果内部函数需要访问外部函数变量,直接使用即可

如果内部函数需要修改外部函数变量,与全局变量一致有两种情况

1.外部函数变量是可变类型,内部函数直接调用修改方法即可

2.外部函数变量是不可变类型,内部函数需要用nonlocal关键字声明

def outer():
    a = 19
    print(a)

    def inner():
        # 修改外部的a变量
        nonlocal a
        a = 11
        print(a)
    # 调用内部函数后,打印a应该是11
    inner()
    print(a)
    return inner
def outer():
    a = []

    def inner():
        a.append(123)

    # 调用内部函数后,打印a应该是[123]
    inner()
    print(a)
    return inner


a = outer()
a()

生命周期

局部变量在函数被调用完成后则从内存中释放

全局变量是在程序运行结束后才会被内存释放

 应用场景

在做接口自动化的时候有接口要求创建的表名和项目名称一致

项目名称是根据函数生成的(随机生成的数据库中不存在的项目名称),每次调用时会导致生成的名称不一致。在这个时候用到了全局变量

根据全局变量的生命周期特性。在项目名称生成时修改全局变量的值,表名就直接获取全局变量的值即可。

还有一种方式,在项目名称生成时写入一个文件,表名获取文件里的值,每次用例执行前清理该文件即可

你可能感兴趣的:(100天学习python,servlet,java,开发语言)