名称空间(namespaces)与作用域

news2024/11/20 12:23:14

引入

在python解释器中运行一行代码import this就可以看到“传说”中的python之禅,它体现了使用python进行开发的规范,而最后一句 - Namespaces are one honking great idea -- let's do more of those!就是本文的主角。

名称空间(Namespaces)

名称空间就是存放名字与对象绑定关系的地方,是对栈区的划分。定义一个变量。name = 'python',解释器会申请内存空间存放值'python',将名字name与'python'的内存地址的绑定关系存在栈区中。

有了名称空间之后就可以在栈区中存放相同的名字,在程序执行期间最多会存在三种名称空间,每种名称空间相互独立。

内置名称空间(built-in)

存放的是python解释器内置的名字,比如python中的保留字(关键字)。python解释器启动时内置名称空间就会产生,python解释器关闭,则销毁。

# 在交互式的解释器环境中输入print然后回车
>>> print
<built-in function print>

全局名称空间

只要不是函数内定义也不是内置的名字,剩下的全部都是全局名称。全局名称空间在运行python文件时产生,python文件执行完成之后销毁。

x = 1  # x是全局名称
def func():  # func是全局名称
    print(x)  # print是内置名称

局部名称空间

函数内定义的名字都会被存放在局部名称空间。局部名称空间在调用函数时产生,函数运行完毕后销毁。

def func():  # func全局名称
    x = 100  # x局部名称
    print(x)  # print内置名称 

名称空间与作用域

名称空间的加载顺序是:内置名称空间->全局名称空间->局部名称空间。

名称空间销毁顺序是:局部名称空间->全局名称空间->内置名称空间。

按照名称空间中名字的作用范围可以将三种名称空间划分为两个区域。

全局作用域---全局名称空间、内置名称空间中的名字属于全局作用域,全局作用域中的名字在整个文件执行过程中都不会被销毁,在任意位置都可以使用。

局部作用域---位于局部名称空间中的名字属于局部作用域,局部作用域中的名字在函数调用时产生,调用结束时销毁,只能在函数内使用。

作用域与名字查找优先级

名字顺序的查找需要记住一条准则:名字的查找顺序以函数阶段为准,与调用阶段没有关系。

  • 从局部作用域开始

在局部作用域查找名字,起始位置是局部作用域,现在局部名称空间中查找,找不到再去全局作用域查找,先查找全局名称空间,找不到再去内置名称空间,最后都找不到会抛出异常。

  • 从全局作用域开始

在全局作用域查找名字时,起始位置就是全局作用域,先查找全局名称空间,找不到再去内置名称空间,最后都找不到会抛出异常。

  • 名称空间的“嵌套关系”

这里的嵌套可以理解为不同的名称空间都存在同样的变量名,注意:一定要以函数定义阶段为准,并且牢记名称空间的查找顺序。

global & nonlocal

如果想要在函数内修改全局名称空间中名字的值并且该值是不可变数据类型,需要用到global关键字,如果该值是可变数据类型,则无需使用global,可以直接对原值进行修改。

x = 100
l = [1, 2]
def func():
    global x  # 声明x是全局名称空间的名字
    x = 101
    l.append(3)
func()
print(x)  # 101
print(l)  # [1, 2, 3]

对于嵌套多层的函数,可以使用nonlocal关键字对外层嵌套函数定义的名字进行声明并修改其值。nonlocal会从当前函数的外层函数一层一层去查找声明的名字,如果在最外层函数的名称空间中找不到该名字,会抛出异常。

def func():
    x = 10
    def func1():
        nonlocal x  
        x = 11
    func1()  # 修改func作用域中x的值
    print(x)  # 在func作用域中查看x的值
func()  # 11

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

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

相关文章

PointNet:利用深度学习对点云进行3D分类和语义分割

PointNet&#xff1a;利用深度学习对点云进行3D分类和语义分割 参考自&#xff0c;PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation 代码仓库地址为&#xff1a;https://github.com/charlesq34/pointnet/ 介绍 这次介绍的是一个比较基础的工作…

部署博客系统(部署博客系统到云服务器)

目录 1、建库建表 2、微调本地代码 3、打包&#xff08;使用Maven打成war包&#xff09; 4、拷贝到Tomcat的webapps 5、启动Tomcat服务器&#xff08;只有启动成功了才能进行访问&#xff09; 6、访问博客系统 1、建库建表 云服务器访问的是云服务器上的数据库,不是…

FFmpeg YUV 编码 H264

1. x264 库 由于 FFmpeg 不支持 h264 编码,所以需要集成 x264 库,现在使用的是当前最新版本 1.1 官方下载地址: videolanhttps://www.videolan.org/developers/x264.html 1.2 编译脚本地址: x264-ioshttps://github.com/kewlbear/x264-

【信息系统项目管理师】概要和框架-2023年5月7日总结

还有20天考试&#xff0c;记录下这二十天的学习内容。 今天之前4月4日到4月13日五天修炼看了一半&#xff0c;看到了项目风险管理&#xff0c;云里雾里看了个大概。 听野人老师的课从第一章跟着到了第十章&#xff0c;听一会儿就走神&#xff0c;听一会儿就走神。 改变思路&…

1.4 初探Spring - 采用Java配置类管理Bean

一、采用Java配置类管理Bean 1、打开项目 Maven项目 - SpringDemo 2、创建子包 在net.hf.spring包里创建day04子包 3、创建杀龙任务类 在day04子包里创建杀龙任务类 - SlayDragonQuest package net.hf.spring.day04;/*** 功能&#xff1a;杀龙任务类* 作者&#xff1…

Ubuntu搭建VPN服务

PPTD协议 此协议据说安全级别不高&#xff0c;苹果系统已经不支持&#xff0c;但windows依然支持 1.安装,root账号登录服务器 apt-get update apt-get install pptpd 2.配置主机ip及连接主机的设备所分配ip池,客户端分配的内网ip段。 vim /etc/pptpd.conf 将以下两行注释去…

同云跨可用区备份容灾解决方案详解

云可用区 云可用区&#xff08;Availability Zone,AZ&#xff09;是一个可用区是一个或多个物理数据中心的集合&#xff0c;有独立的风火水电&#xff0c;可用区内逻辑上再将计算、网络、存储等资源划分成多个集群。一个地域中的多个可用区间通过高速光纤相连&#xff0c;以满足…

Ubuntu安装Mininet和Ryu出现的问题

问题1-Ryu: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host‘pypi.org’, port443): 解决&#xff1a; pip install XXX -i http://pypi.douban.com/simple --trusted-host pypi.douban.com或 pip install XXX -i http://mirrors.aliyun.c…

国内首个BIM全生命周期装配式建筑项目,建设仅用25周

hi大家好&#xff0c;这里是建模助手。 文章开头我想先问问各位&#xff0c;在你眼中&#xff0c;25周能干点什么&#xff01;小编和你说&#xff0c;在建筑行业里的25周&#xff0c;可以完成一整个保障房项目的建设。 我没开玩笑... 4月16日下午&#xff0c;随着最后一个混凝土…

信号与槽机制

一、信号与槽 1、什么是信号与槽&#xff1f; 信号和槽是用于对象之间的通信&#xff0c;它是Qt的核心机制&#xff0c;在Qt编程中有着广泛的应用。如果想学好Qt&#xff0c;一定要充分掌握信号的槽的概念与使用。 2、信号和槽的代码实例 在Qt中&#xff0c;发送对象、发送的信…

美国纽扣电池的包装电池盒必须附带警告标签16 CFR 第 1700.20

美国纽扣电池及硬币电池的包装、电池盒必须附带警告标签16 CFR 第 1700.20 美国要求在纽扣电池或硬币电池的包装上、电池盒上以及包含纽扣电池或硬币电池的消费品附带说明和手册上贴上警告标签。 商品法规、标准和要求纽扣电池和硬币电池以下所有项&#xff1a; 16 CFR 第 17…

虚幻引擎配置物体水面浮力的简便方法

虚幻引擎配置物体水面浮力的简便方法 目录 虚幻引擎配置物体水面浮力的简便方法前言前期工作配置水面浮力针对一个立方体的水面浮力配置针对船3D模型的水面浮力配置 小结 前言 在使用虚幻引擎配置导入的3D模型时&#xff0c;如何快速地将水面浮力配置正确&#xff0c;从而使得…

快速原型设计工具(Axure)的简单使用

1.运行 安装好后运行&#xff0c;可以看到欢迎界面(不想每次启动都弹出这个的话建议勾选启动时不显示) ​ 这就是Axure的主要界面了&#xff0c;能成功进到这里就说明安装成功&#xff01; 2.Axure主要界面 3.展示形式 通过Axure这个软件生成和打开的文件的后缀名是 .rp&#x…

如何在Jetpack Compose中将可滚动项捕捉到屏幕中心

如何在Jetpack Compose中将可滚动项捕捉到屏幕中心 从 Snapper 迁移到 SnapFlingBehavior 之前&#xff0c;我们探讨了Android应用程序开发中一个常见的用例&#xff1a;在fling手势后将可滚动项捕捉到屏幕中心。 为了在Jetpack Compose中实现这一目标&#xff0c;我们使用…

手把手教你写Web自动化测试并生成美观交互的测试报告

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 摘要&#xff1a; Web自动化测试 Allure测试报告 总结 摘要&#xff1a; 在Web应用程序开发中&#xff0c…

ICV: 全球QRNG产业规模在2030年有望突破200亿美元

近日&#xff0c;专注于前沿科技领域的国际咨询机构ICV发布了《全球量子随机数发生器的产业研究报告》&#xff0c;从多个角度对QRNG的市场进行预测。 QRNG 是解决与随机数相关的问题&#xff08;例如密码解决方案&#xff09;的重要硬件来源。 QRNG 是随着量子物理技术的发展…

DJ4-4 基本分页存储管理方式

目录 离散分配的基本概念 4.4.1 分页存储管理基本思想 1、分页存储管理的基本方法 2、页面与物理块 3、实现分页存储管理的数据结构 4、实现分页存储管理的地址结构 5、分页存储管理的逻辑地址表示 4.4.2 地址变换机构 1、基本的地址变换机构 2、具有快表的地址变换…

Alibaba技术官熬夜肝出的,Kafka “限量笔记” 牛掰 ~

前言 分布式&#xff0c;是程序员必备技能之一&#xff0c;在面试过程中属于必备类的&#xff0c;在工作中更是会经常用到。而Kafka是一个分布式的基于发布订阅的消息队列&#xff0c;目前它的魅力是无穷的&#xff0c;对于Kafka的奥秘&#xff0c;还需要我们细细去探寻。 要…

GUN C编译器拓展语法学习笔记(三)内联函数、内建函数与可变参数宏

内联函数、内建函数与可变参数宏 一、内联函数1.1 属性声明&#xff1a;noinline1.2 内联函数与宏1.3 编译器对内联函数的处理1.4 内联函数为什么定义在头文件中 二、内建函数2.1 内建函数定义2.2 常用的内建函数2.3 C标准库的内建函数2.4 内建函数&#xff1a;__builtin_const…

WPF异常处理详解

总目录 文章目录 总目录一、WPF异常1 未捕获异常2 模拟未捕获异常场景 二、处理未捕获异常1 DispatcherUnhandledException 异常捕获2 UnhandledException异常捕获3 UnobservedTaskException异常捕获4 异常捕获的综合使用 结语 一、WPF异常 1 未捕获异常 正常情况下&#xff…