首页 > 其他分享 >名称空间与作用域

名称空间与作用域

时间:2024-04-16 20:44:46浏览次数:28  
标签:函数 作用域 list print num 名称 空间 变量

【一】名称空间

【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修改外层函数变量

标签:函数,作用域,list,print,num,名称,空间,变量
From: https://www.cnblogs.com/song1002/p/18139141

相关文章

  • 过程与作用域
    一个过程创建好后,就可以象Tcl内建命令一样直接使用。 Tcl8.0以后的版本增加了名字空间(namespace),它为过程和变量提供了新的作用域。 1.proc—过程定义命令 使用proc命令定义过程: procprocName{var1var2...}{body } proc命令有三个参数:procName......
  • oracle表空间扩充
    一、查询表空间使用情况SELECTUPPER(F.TABLESPACE_NAME)"表空间名",D.TOT_GROOTTE_MB"表空间大小(M)",D.TOT_GROOTTE_MB-F.TOTAL_BYTES"已使用空间(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB-F.TOTAL_BYTES)/D.TOT_GROOTTE_MB*100,2),'990.99')&q......
  • 函数的调用方式、函数的参数、类型提示语、名称空间
    【一】函数的调用方式defstudent(name,age):print(f"mynameis{name}andmyageis{age}")[1]直接调用函数函数名()----->调用函数student(name='max',age=18)[2]用表达式调用函数用一个新变量存储函数的内存地址然后调用defadd(x,y):returnx......
  • 9.函数参数 与 名称空间
    【一】函数作为参数1)分类1.形参函数定义时,括号内声明的值;用来接收外部传来的值2.实参函数调用时,括号内传入的得值;常是常量,变量,表达式或三者组合2)位置参数参数数量不对会报错必须按照顺序传入,否则顺序会乱3)关键字参数需指定定义时的名字,可不按位置传入4)默认参数......
  • git默认忽略文件名称大小写
    0.现象当将文件名称test修改为Test时,git提交记录检测不到变化1.原因Git默认设置忽略文件名大小写是因为不同操作系统对文件名大小写的处理方式不同,为了避免在不同操作系统之间出现文件名大小写不一致的问题,Git默认忽略文件名大小写。2.修改默认不忽略gitconfigcore.ig......
  • 一道变态的关于作用域的探究问题
    varx=1functionfoo(x=11,y=function(){x=2}){console.log(x)//打印的()的形参x因为默认值为11所以打印11y()//y函数执行修改的是foo括号里面形参的值console.log(x)//由于()中的x被y函数修改所以x值变为2x......
  • 参数,名称空间,作用域
    1函数的调用方式【1】直接调用函数名()-->调用函数defstudent(name,age):print(f"mynameis{name},myageis{age}")#函数名()-->调用函数student(name="silence",age=16)#mynameissilence,myageis16【2】用表达式调用函数用一个新变量存储函数的内......
  • ubuntu根目录lvm没用满分区空间
    ubuntu23.10安装虚拟机之后,磁盘分区没有用完,根目录只占了10G。#lvm逻辑卷使用分区100%空间lvextend-l+100%FREE/dev/mapper/ubuntu--vg-ubuntu--lv#df-h重新计算结果resize2fs/dev/mapper/ubuntu--vg-ubuntu--lv......
  • 内联和嵌套命名空间
    在开发大型的项目时,往往会有很多人参与协同开发,划分成各个小组负责不同的模块,模块之间相对独立。代码中会定义很多的类名、函数名、模板名,甚至一些全局变量,如果不对这些名称加以规范,很容易造成名字的冲突,因为默认情况下这些名字都是全局名字,这种情况也称之为命名空间污染。为了避......
  • fatfs文件系统读取剩余空间实例解析
    一前记 文件系统读取剩余内存空间并显示是一个常用的功能。这个函数是:FRESULTf_getfree(constTCHAR*path,DWORD*nclst,FATFS**fatfs);/*Getnumberoffreeclustersonthedrive*/第一个入参是文件路径,第二个参数剩余空间的指针,第三个参数是文件名。二实例......