Python3 命名空间和作用域 | 菜鸟教程(十七)

news2024/11/16 7:31:21

目录

一、命名空间

(一)简介

1、命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。

2、命名空间提供了在项目中避免名字冲突的一种方法。

3、各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

4、我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

 (二)一般有三种命名空间

1、内置名称(built-in names)

2、全局名称(global names)

3、局部名称(local names)

 (三)命名空间查找顺序:

 (四)命名空间的生命周期

 二、作用域

(一)简介

(二)Python 的作用域有四种:

1、L(Local)

2、E(Enclosing)

3、G(Global)

4、B(Built-in)

(三)规则顺序:L –> E –> G –> B。

1、在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

 2、内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。

3、在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:

 4、Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:

(四)全局变量和局部变量

1、定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

2、局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

3、调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

 (五)global 和 nonlocal关键字

1、当内部作用域想修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字了。

2、以下实例修改全局变量 num:

3、 如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了

4、 另外有一种特殊情况,假设下面这段代码被运行:


一、命名空间

(一)简介

1、命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。

2、命名空间提供了在项目中避免名字冲突的一种方法。

3、各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

4、我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

 (二)一般有三种命名空间

1、内置名称(built-in names

Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。

2、全局名称(global names)

模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。

3、局部名称(local names)

函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

 (三)命名空间查找顺序:

假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间

如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:

NameError: name 'runoob' is not defined。

 (四)命名空间的生命周期

命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

因此,我们无法从外部命名空间访问内部命名空间的对象。

 如下图所示,相同的对象名称可以存在于多个命名空间中。

 二、作用域

(一)简介

1、作用域就是一个 Python 程序可以直接访问命名空间的正文区域。

2、在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。

3、Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

4、变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。

(二)Python 的作用域有四种:

1、L(Local)

最内层,包含局部变量,比如一个函数/方法内部。

2、E(Enclosing)

包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。

3、G(Global)

当前脚本的最外层,比如当前模块的全局变量。

4、B(Built-in)

包含了内建的变量/关键字等,最后被搜索。

(三)规则顺序:L –> E –> G –> B

1、在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

 举例:

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

 2、内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。

3、在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:

>>> import builtins
>>> dir(builtins)

 4、Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:

>>> if True:
...  msg = 'I am from Runoob'
... 
>>> msg
'I am from Runoob'
>>> 

实例中 msg 变量定义在 if 语句块中,但外部还是可以访问的。

 如果将 msg 定义在函数中,则它就是局部变量,外部不能访问:

>>> def test():
...     msg_inner = 'I am from Runoob'
... 
>>> msg_inner
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'msg_inner' is not defined
>>> 

 从报错的信息上看,说明了 msg_inner 未定义,无法使用,因为它是局部变量,只有在函数内可以使用。

(四)全局变量和局部变量

1、定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

2、局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

3、调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

实例:

 以上实例输出结果:

函数内是局部变量 :  30
函数外是全局变量 :  0

 (五)global 和 nonlocal关键字

1、当内部作用域想修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字了。

2、以下实例修改全局变量 num:

 以上实例输出结果:

1
123
123

3、 如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了

实例:

 以上实例输出结果:

100
100

4、 另外有一种特殊情况,假设下面这段代码被运行:

 以上程序执行,报错信息如下:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test()
  File "test.py", line 5, in test
    a = a + 1
UnboundLocalError: local variable 'a' referenced before assignment

错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。

修改 a 为全局变量:

 也可以通过函数参数传递:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

访问者模式(Vistor)

定义 访问者是一种行为设计模式&#xff0c;它能将算法与其所作用的对象隔离开来。 前言 1. 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。图像中的每个节点既能代表复杂实体&#xff08;例如一座城市&#xff09;&#xff0c; 也能代表更精细的对象…

Nginx【Docker(安装Nginx、Nginx服务启停控制、全局块、events块、HTTP块)】(二)-全面详解(学习总结---从入门到深化)

目录 Docker安装Nginx Nginx服务启停控制 Nginx配置指令详解_全局块 Nginx配置指令详解_events块 Nginx配置指令详解_HTTP块 Docker安装Nginx 拉取官方的Nginx镜像 [rootlocalhost ~]# docker pull nginx 以下命令使用 Nginx 默认的配置来启动一个 Nginx 容器实例&#xf…

小驰私房菜_28_Qcom Camx相关名词

(Qcom 7325平台) CSID = Camera Serial Interface Decoder module IPE = Image Processing Engine IFE (x3) = Image Front End IFE_lite (x2) BPS = Bayer processing segment (for Snapshot) IPE = Image Processing Engine VPU = Video Processing Unit (CODEC) DP…

matplotlib布局模式

栅格布局 import matplotlib.pyplot as plt import numpy as np plt.figure("OBJ")x np.linspace(-np.pi, np.pi, 1000) cosy np.cos(x) siny np.sin(x) y x * 0.5 timesy x ** 2 # 创建九宫格 gs plt.GridSpec(3, 3) # 第0-1行&#xff0c;第2列 plt.subplot…

Eclipse中有用的快捷键

Eclipse中有的快捷键自己记不清楚&#xff0c;但用起来又很方便&#xff0c;遇到了就放在这边备忘。 【CtrlO】快速定位某个类中的属性、方法 有时候&#xff0c;一个类中的属性、方法比较多&#xff0c;想用快捷键快速查找&#xff0c;提升效率。 举例&#xff1a;我想查找…

MYSQL-聚合函数及分组查询

常用聚合函数 COUNT() 求有多少行 SUM() 求和 AVG() 求平均值 MIN() 求最小值 MAX() 求最大值 举个栗子 SELECT AVG(price) FROM products WHERE price_id > 10; 这行代码就是在求id大于10的价格的平均值 AVG(price)表示求price列的平均值 执行逻辑为 先由WHERE…

Mock在接口测试中的实际应用

关于Mock测试 01、含义和目的 1、 什么是mock测试&#xff1f; Mock 测试就是在测试过程中&#xff0c;对于某些不容易构造&#xff08;如 HttpServletRequest 必须在Servlet 容器中才能构造出来&#xff09;或者不容易获取的比较复杂的对象&#xff08;如 JDBC 中的ResultSe…

chatgpt赋能python:下载完Python,如何进入编辑器

下载完Python&#xff0c;如何进入编辑器 Python是一门高级编程语言&#xff0c;具有简单易懂、易于学习、可拓展性强等特点&#xff0c;被广泛应用于Web应用、桌面应用、科学计算、人工智能等众多领域。如果你已经下载并安装了Python&#xff0c;那么接下来如何进入编辑器呢&…

uniapp智慧停车场系统微信小程序h5、APP源码 智能停车系统源码 安装搭建部署教程

【APP】: flutter(原生混合框架&#xff0c;不是web封装&#xff0c;原生应用&#xff0c;一套代码直接生成原生Android和ios应用)&#xff0c;既不损失性能&#xff0c;也能降低开发成本 【小程序/h5/公众号】&#xff1a;uni-app(底层框架Vue) 【后台管理】&#xff1a;vue-e…

DeepSpeed-Chat 打造类ChatGPT全流程 笔记一

这篇文章主要是对DeepSpeed Chat的功能做了一些了解&#xff0c;然后翻译了几个主要的教程了解了一些使用细节。最后在手动复现opt-13b做actor模型&#xff0c;opt-350m做reward模型进行的chatbot全流程训练时&#xff0c;踩了一些坑也分享出来了。最后使用训练后的模型做servi…

计算机组成原理(课堂测验3次)

3、同步通信与异步通信的主要区别是什么&#xff0c;说明通信双方如何联络。 同步通信和异步通信的主要区别是&#xff1a;前者有公共时钟线&#xff0c;所有设备按统一的时序、同一的传输周期进行信息传输&#xff0c;通信双方按约定好的时序联络&#xff1b;后者没有公共时钟…

探秘直链网盘:高效传输、便捷分享的存储利器!

什么是直链网盘&#xff1f; 直链网盘是一种用于存储和共享文件的在线服务。它为用户提供了一个方便的方式来存储和访问他们的文件&#xff0c;而无需依赖本地存储设备。直链网盘的主要特点是它们可以生成直接下载链接&#xff0c;允许用户快速下载文件&#xff0c;而不需要进…

使用 Sigstore 签名的 Elastic Stack 容器镜像!

作者&#xff1a;Maxime Greau 软件供应链攻击不断增加。 这就是为什么这个主题是安全领导者的首要任务。 在这方面&#xff0c;这篇博文重点介绍了使用 Sigstore 对 Elastic Stack 容器镜像进行签名的新功能&#xff0c;以便&#xff1a; 保护 Elastic 软件供应链工作流程为…

java面试Day14

1.如何使用 Redis 实现一个排行榜&#xff1f; Redis实现排行榜是Redis中一个很常见的场景&#xff0c;主要使用的是ZSet进行实现&#xff0c;下面是为什么选用ZSet&#xff1a; 有序性&#xff1a;排行榜肯定需要实现一个排序的功能&#xff0c;在Redis中有序的数据结构有List…

Tauri:跨平台探索之旅

一、简介 Tauri 是一个跨平台 GUI 框架&#xff0c;与 Electron 的思想基本类似。都是属于跨平台技术的解决方案 优缺点快速分析 我们一般会把tauri作为 Electron 的替代方案&#xff0c;electron优点咱们不看&#xff0c;这里就提两个electron比较明显的问题&#xff1a; 安装…

高考志愿填报的个人看法,希望能对你有所启发

各省高考成绩已出&#xff0c;又到一年高考季。张雪峰提到&#xff1a;“普通家庭不要光谈理想&#xff0c;也要谈落地。”志愿怎样填报、选专业还是选学校、什么专业好就业、高考志愿主要看什么&#xff1f; 作为一名过来人&#xff0c;今天就站在小部分群体的角度来聊聊&…

自动化测试常见的三大问题及解决方案

各位小伙伴们&#xff0c;大家好&#xff0c;今天给大家带来的是关于自动化测试常见的三大问题及解决方案&#xff0c;希望给遇到这三大问题的你一些帮助 一&#xff0c;就是我们定位元素的时候&#xff0c;定位不到或有时定位得到&#xff0c;有时定位不到。 特别是喜欢复制…

策略模式(Strategy)

定义 策略是一种行为设计模式&#xff0c;它能让你定义一系列算法&#xff0c;并将每种算法分别放入独立的类中&#xff0c;以使算法的对象能够相互替换。 前言 1. 问题 你打算为游客们创建一款导游程序。该程序的核心功能是提供美观的地图&#xff0c;以帮助用户在任何城市…

数据结构 手撕顺序表(动态版)+代码详解

⭐️ 顺序表介绍 顺序表是线性表的一种。 &#x1f320;什么是线性表呢&#xff1f; 线性表是数据结构的一种&#xff0c;一个线性表是 n n n个具有相同特性的数据元素的有限序列。常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… &#x1f320;什么是顺序表呢&…

Docker + Wasm = 王炸!!!

Docker 宣布推出与 WebAssembly 集成 (DockerWasm) 的首个技术预览版&#xff0c;并表示公司已加入字节码联盟 (Bytecode Alliance)&#xff0c;成为投票成员。 Bytecode Alliance&#xff08;字节码联盟&#xff09;由 Mozilla、Fastly、Intel 与 Red Hat 联合成立&#xff0c…