12. 函数的名称空间与作用域

news/2024/11/15 4:37:38/文章来源:https://www.cnblogs.com/hbutmeng/p/18331203

1. 名称空间

1.1 概念

名称空间是存放变量名与变量值映射关系的地方

1.2 分类

1.2.1 内置名称空间

Python解释器运行而产生的名称空间,如def、if、else、len

Python解释器运行---产生

Python解释器关闭---释放

1.2.2 全局名称空间

在python文件中编写的代码运行产生的名字都会存到全局名称空间(函数体代码之外的)

name = 'LeoMessi'  # 变量名name存入全局名称空间def login():  # 函数名login存入全局名称空间passif True:a = 111  # 变量名a存入全局名称空间
for i in range(10):  # 变量名i存入全局名称空间    pass
while True:b = 222  # 变量名b存入全局名称空间

python文件开始运行 产生

python文件运行结束 释放

1.2.3 局部名称空间

函数体代码运行产生的都是局部名称空间

def register():name = 'ronaldo'  # name存入局部名称空间

函数体代码开始运行  产生

函数体代码运行结束  释放

1.3 名称空间的查找顺序

在查找名字的时候,一定要先搞清楚当前在哪个空间

1. 如果在局部名称空间

   局部名称空间————>  全局名称空间————>  内置名称空间

2. 如果在全局名称空间

  全局名称空间————>  内置名称空间

  (只能向外层不能向里层)

3.代码执行顺序

# 局部名称空间之间如果不是嵌套关系,那么互不干涉
def f1():name = 'LeoMessi'
def f2():age = 35print(name)  # 报错not defined
f1()
f2()

 2. 作用域

2.1 概念

作用域就是名称空间能够作用的范围,即变量名和变量值可以被访问的范围(变量名定义的位置和可以查找的位置)

2.2 分类

内置作用域  Built-in

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

程序任意阶段、任意位置均可使用(全局有效)

全局作用域  Global

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

作用范围:当前模块(文件)

 程序任意阶段、任意位置均可使用(全局有效)

 

局部作用域  Local

 

Local(局部变量):暂时的存在,依赖于创建该局部作用域的函数。

函数存在,则局部变量存在;函数不存在,则局部变量不存在。
作用范围:当前整个函数体范围

一般情况下,只在各自局部名称空间中有效(局部有效)

内嵌作用域  Enclosed

Enclosed(嵌套):一般是在函数中嵌套函数的时候,外层函数的变量作用域。
作用范围:闭包函数

 

 

2.3 作用域举例

内置作用域举例:

内建作用域里面提前加载好的  如os

import os

 

全局作用域举例:

自己在文件中定义的变量  

num = 123

 

局部作用域与内嵌作用域举例:

age = 18
# 局部作用域:定义在函数或者类内部的所有变量 # 内嵌作用域:在函数中嵌套函数的时候,外层函数的变量作用域。 def student():age = 28 # 这里的age对student函数是局部作用域,对inner函数是内嵌作用域print(f" student my age is {age}")def inner():age = 38 # 这里的age为inner函数的局部作用域print(f"inner my age is {age}")inner()student() print(f"global my age is {age}")

作用域的加载顺序:内置 -- 全局 -- 外层 -- 里层
查找循序 : 里层 -- 外层 -- 全局 -- 内置
 查找顺序遵循一个规则 LEGB 规则
L ---> local 局部的局部    最里层的函数
E ---> enclosed  内嵌,相对里层嵌套函数的外层
G ---> global 全局
B ---> built-in 内建

2.4 作用域声明

def func():
# 使用关键字来提 高当前变量的级别
# 局部修改全局不可变数据类型需要使用 global 提高当前作用域级别
global age
age = 19
age_ = age
print(f"func my age is {age}")
print(f"func my age_ is {age_}")
user_dict["age"] = 999

def inner():
# 提高内嵌函数作用域的变量级别
nonlocal age_ # no binding for nonlocal 'age' found
age_ = 38
print(f"inner my age_ is {age_}")
user_dict["age"] = 888

inner()
print(f"func my age_ is {age_}")


func()
print(f"global my age is {age}")
print(user_dict["age"])
# 字典是可变数据类型 ,大家对于修改字典的时候都是修改的同一块内容空间地址上面的值

# 【总结】
# 【1】名称空间就是存放变量名和变量值映射关系的地方 内建 全局 局部
# 【2】作用域就是变量名和变量值映射关系存放的范围 内建 全局 局部 内嵌
# 【3】如果局部修改全局不可变数据类型 用 global 提高当前作用域级别
# 如果是内嵌修改局部不可变数据类型 用nonlocal 提高作用域级别
# 内嵌作用域无法修改全局作用域中的不可变数据类型

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/773853.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构 | 互联架构的图建模分析

互联网络泛泛谈 互联网络是一种图结构,节点之间通过边连接。比如一般总线计算机架构中 CPU、Memory、Timer 等模块看作节点, 通过总线相连。每个节点在网络中的身份是不对等的,有 Master 和 Slave 之分,或者按 TLM 中的模型 initiator 和 target。Initiator 有权申请发起传…

关于嵌入式QML dict_pinyin.dat的编译更新

硬件平台:全志的A40I-H 软件平台:Linux 内核版本3.10.65 QT版本:5.9.0重新编译dict_pinyin.dat的作用 1.解决输入"nss"导致输入法崩溃的问题 2.解决输入某些嵌入式平台不支持的字体,例如“捃”,导致程序崩溃的问题源码路径: ~/qt-everywhere-opensource-src-…

15-并发控制理论

15-并发控制理论 并发控制横跨了多个层级:operator Execution 操作执行 Access Methods 读表 buffer Pool Manager 缓存池日志恢复buffer Pool Manager 缓存池 Disk 磁盘管理Motivation:当多人修改数据库同一条数据,就会出现竞争问题 把100块钱从A账户转移到B账户,如果A账…

安装 jar包为windows服务

下载安装Java Service Wrapper 下载https://www.krenger.ch/blog/category/windows/ 安装 下载后在D盘找个位置解压: 在同级目录建一个新的文件夹,就命名JavaServiceWrapper吧:在文件夹JavaServiceWrapper下新建bin、conf、lib、logs、jre文件夹: 给下载解压的src/bin下边标…

2. GPIO读写

GPIO简介GPIO(全称为General Purpose Input/Output),即通用输入/输出,可以认为GPIO是片外外设与片内的通信接口,通过控制GPIO的电平状态,可以实现片外外设与片内的通信以及数据的输入输出。对于st32F103系列的GPIO,其命名规则为GPIO+端口号,如GPIOA,GPIOB。对于每个端口又…

使用 Easysearch 打造企业内部知识问答系统

大家可能都有这样的经历,刚入职一家企业时,同事往往会给你分享一些文档资料,有可能是产品信息、规章制度等等。这些文档有的过于冗长,很难第一时间找到想要的内容。有的已经有了新版本,但员工使用的还是老版本。 基于这种背景,我们可以利用 Easysearch 加 LLM 实现一个内…

Web系列-文件上传

Web系列-文件上传 做题思路 前端限制了上传文件的后缀,可以在前端修改代码或者bp抓包,再上传符合前端要求的文件类型,抓包后进行修改。 如果是php的环境,可以利用.user.ini,是一个局部配置文件,可以通过配置选项使每个php文件头或文件尾都进行文件包含 .user.ini利用需要…

【ollama】手把手教你布置本地大语言模型 以及各种常见用途#如何加载guff模型到ollama #如何更改ollama目录

ollama介绍 Ollama 是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。 以下是其主要特点和功能概述:简化部署:Ollama 目标在于简化在 Docker 容器中部署大型语言模型的过程,使得非专业用户也能方便地管理和运行这些复杂的模型。轻量级与可扩展:作…

SPONGE常用教程0:软件安装教程

课程准备阶段,介绍最简明安装流程,安装过程中如果遇到其他问题,请移步官方教程。第三方软件只提供个人安装心得。 软件安装环境默认为linux。 软件支持 SPONGE(Simulation Package tOward Next GEneration molecular modelling)是由北京大学高毅勤课题组开发的分子动力学模…

使用高速收发器进行数据传输(一)

本来想做一个这样的项目,但是简单地使用这个方法传递数据实在是没意义; 我希望最后以万兆网来实现这点; 目前事实上只是按照UG476的要求给IP核数据和取数即可,并不困难;

虚拟机:GCC共享库在连接时的搜索位置和优选次序

假设有两个相同的共享库,一个在标准的共享库搜索目录(/lib/i386-linux-gnu), 一个在非标准目录(/home/charles/tmp):在/home/charles/tmp下有个测试程序main.c, 调用共享库里的函数。 用如下的命令编译: 用ldd看一下link的共享库:可以看出,虽然我们指定了 要使用 …