song1002  

【一】名称空间

【1】什么是名称空间

名称空间就是存放函数名与函数值对应关系的地方

变量名=变量值

用变量名 和 变量值进行绑定 ---> 名称空间

名称空间即存放名字与对象映射/绑定关系的地方

【2】名称空间

[1]内建名称空间

  • 在Python解释器中自带的名称空间会随着代码启动而生成,随着代码结束而关闭

[2]全局名称空间

  • 随着内建名称空间加载完成自己创建的变量名 / 函数名 / 类名

列表是可变数据类型 ---> 列表被修改后id不变

num_list = []
print(id(num_list)) # 1200291395392
def add_list(num):
    num_list.append(num)
    print(id(num_list)) # 1200291395392
add_list(1)
add_list(2)
add_list(3)
print(num_list) # [1, 2, 3]
print(id(num_list)) # 1200291395392

[3]局部名称空间

  • 在函数内部或者是类内部定义的变量随着函数启动而创建,随着函数结束而消失
  • 伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间中
def add_list(num):
    # 垃圾回收机制 ---> 节省内存开销
    num_list = []
    num_list.append(num)
    print(num_list)
    print(id(num_list)) # 1200291395392
add_list(1)
add_list(2)
add_list(3)

【3】名称空间的加载顺序

  1. 先加载内建名称空间
  2. 其次是全局名称空间
  3. 最后就是局部名称空间

【4】名称空间的查找顺序

  1. 如果你在全局查 先全局后内建 --> 在 py 文件中执行代码
  2. 如果在局部 先局部再全局再内建 ---> 在函数内部执行代码
  3. 所有的变量 尤其是 可变数据类型 字典 列表 尽量写在文件开头 如果放在函数下面可能会导致检索不到变量

【二】作用域

【1】变量作用域

  • 变量的作用域

    • Python是静态作用域,也就是说Python中,变量的作用域源于它在代码中的位置
    • 在不同的位置,可能有不同的命名空间。命名空间是变量作用域的体现形式
  • python变量作用域一般有4种:

    • Local(局部变量)
    • Enclosed(嵌套)
    • Global(全局)
    • Built-in(内置)

[1]Local 局部变量

  • Local(局部变量):暂时的存在,依赖于创建该局部作用域的函数。函数存,则局部变量存,函数亡,则局部变量亡
  • 作用范围:当前整个函数体范围
# 定义一个函数,函数内部就是局部作用域
def fun():
    # 只有在函数内部的变量
    b = 2
    print(b)  # 输出2


fun()
# 调用函数后,发现找不到变量 b 是因为在全局作用域中找不到 变量 b
print(b)  # 报错

'''
Traceback (most recent call last):
  File "E:\PythonProjects\def_func.py", line 16, in <module>
    print(b)  # 报错
NameError: name 'b' is not defined
'''

[2]Enclosed 嵌套

  • Enclosed(嵌套):一般是在函数中嵌套函数的时候,外层函数的变量作用域。
  • 作用范围:闭包函数
# Enclosed(嵌套)作用域
def fun1():
    b = 2
    print("这是fun1打印的:", b)

    def fun2():
        # 函数 func1 里面 嵌套的 函数 func2 里面的作用域就是 嵌套作用域
        print("这是fun2打印的:", b)

    # 将内部函数 func2 的内存地址返回
    return fun2


# 调用 函数 fun1 , 函数 func1 的返回值是内部函数 fuc2的函数地址
temp = fun1()

# 调用 函数 fun1 的返回值(fuc2的函数地址) , 从而执行 函数 fuc2
temp()
# 这是fun1打印的: 2
# 这是fun2打印的: 2

[3]Global 全局

  • Global(全局):一般模块文件顶层声明的变量具有全局作用域,从外部来看,模
    块的全局变量就是一个模块对象的属性,仅限于单个模块文件中。
  • 作用范围:当前模块(文件)
# Global(全局)作用域

# 定义在全局的变量,在本文件任意位置可调用该变量
a = 2


def fun1():
    print("这是fun1打印的:", a)


fun1()
print(a)

# 这是fun1打印的: 2
# 2

[4]Built-in 内置

  • Built-in(内置):解释器内置的变量,比如int, str等。
  • 作用范围:所有模块(文件)
  • Python中没有块级作用域。
  • 块级作用域:代码块中的变量,比如if、while、for后面的代码

【2】LEGB规则

按照L--->E--->G--->B的顺序查找变量

[1]基于命名空间的常见变量类型

  • 局部变量:
    • 在一个函数体的内部定义的变量
    • 作用域为函数内部
    • 查看局部变量命令:locals()
  • 全局变量
    • 在函数体外部,文件最外层定义的变量
    • 作用域为整个文件内部
    • 查看全局变量命令:globals()

【3】变量的修改

[1]global修改全局变量

[2]nonlocal修改外层函数变量

posted on 2024-04-16 20:39  嘉峪关吴彦祖  阅读(1)  评论(0编辑  收藏  举报