命名空间和作用域

一,namespace

  • namespace是名字到对象的映射,python里面的大部分命名空间由字典实现。如果有性能问题,会更改。

  • 命名空间的举例

    •存放内置函数的集合(abs()这种函数,和内建的异常)
    •模块中的全局名称
    •函数调用中的局部名称
    •某种意义,对象的属性集合
    不同命名空间的名称没得关系,比如两个模块里面都有show()函数,只要指明是哪个模块就行。

namesapce

  • 三种命名空间的区别
    • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。

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

    • 非局部和非全局之间得名称 nonlocal

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

    命名空间查找顺序:(从小到大)
    假设我们要使用变量 BITQIAN,则 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。
    如果找不到变量 BITQIAN,它将放弃查找并引发一个 NameError 异常:

int = 0
def test_namespace():int = 1def inner_show():int = 2print(int)inner_show()test_namespace() # 2 localdef test_namesapce():int = 1def inner_show():print(int) # 1 nonlocalinner_show()def test_namespace():def inner_show():print(int) # 0 global inner_show()del int
def test_namespace():def inner_show():print(int)  # class<int>  built-ininner_show()
  • 命名空间的生命周期
    1,不同时刻创建的命名空间有不同的生命周期,包含内置名称的命名空间(builtins)是在python解释器启动时创建的,不会被删除。
    2,模块的全局命名空间在模块定义被读入时创建,一般,解释器退出,消失。
    3,被解释器的顶层调用执行的语句,从一个脚本文件读取或交互式地读取,被认为是 main 模块调用的一部分,因此它们拥有自己
    的全局命名空间。
    4,命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。因此,无法从外部命名空间访问内 部命名空间的对象。

  • 函数的命名空间
    在调用时创建,函数返回值后,或者异常后删除。但递归调用会有自己的命名空间。

在调用时创建,函数返回值后,或者异常后删除。但递归调用会有自己的命名空间。

二,作用域

1, 作用域被静态确定,但被动态使用。 在程序运行的任何时间,至少有三个命名空间可被直接访问的嵌套作用域:

	• 最先搜索的最内部作用域包含局部名称。 比如一个函数/方法内部。 - local• 从最近的封闭作用域开始搜索的任何封闭函数的作用域包含非局部名称,也包括非全局名称。 - 嵌套函数 nonlocal、一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。• 倒数第二个作用域包含当前模块的全局名称 - global比如当前模块的全局变量。• 最外面的作用域(最后搜索)是包含内置名称的命名空间 - 一定存在 built-in

在这里插入图片描述
2,四种作用域的举例

  • 全局名称与局部名称
# var1 是全局名称
var1 = 0
def my_func():var2 = 1 # var2 是局部名称def my_innerfunc():var3 = 2 # var3 是内嵌局部名称
  • 访问全局,局部名称,是两个分开的东西
		global_var = 0 # 全局作用域def show():local_var = 'nonlocal scope' # 闭包函数外的函数中# print(inner_local_var) 无法访问def local_func():inner_local_var = 'local scope' # 局部作用域local_func()show()
  • 内置作用域
		# 内置作用域import builtinsprint(dir(builtins))
  • 控制语句的作用域可以理解是全局的
		'''♥,在python中只有函数,类,lambda,模块才会引入新的作用域,其它的代码块不会引入(if elif else         while / for           try/except/else/finally)'''>>> try:...     a = 1...     print(1/0)... except:...     print('you\'re wrong!')...     raise... finally:...     print('a', a)...you're wrong!a 1Traceback (most recent call last):File "<stdin>", line 3, in <module>ZeroDivisionError: division by zero>>> a1
  • nonlocal,非全局也非局部,只可在嵌套函数内访问
def update_nonlocal(): # 全局名称var = 1 # 局部名称def inner():nonlocal var # 存在非局部,非全局变量之间var = 100print(var) # 100inner()print(var) # 100

3,global和nonlocal的区别

  • nonlocal的作用域只在嵌套函数中,而且在第一个嵌套函数中声明了名称,才可在第二个函数中声明这个变量为nonlocal
def test_nonlocal():x = 99print(x, id(x))def show_x():nonlocal x print(x, id(x))x = 999print(x, id(x))show_x()test_nonlocal()
'''
99 140705925728384
99 140705925728384
999 2145717490672
'''
  • global 的名称在函数中可以读,但是不可写,除非你把这个函数中的名称也申明为global
num = 1
print('全局名称num ', num)
def update_num():global num # 声明全局名称num = 11update_num()
print('global 关键字后,', num)
'''
全局名称num  1
global 关键字后, 11
'''

最后,一张namespace和scope的图送上
distinct

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

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

相关文章

[转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

本文从三方面总结迭代器 迭代器的思想迭代器相应型别及traits思想__type_traits思想一 迭代器思想 迭代器的主要思想源于迭代器模式&#xff0c;其定义如下&#xff1a;提供一种方法&#xff0c;使之能够依序巡防某个聚合物&#xff08;容 器&#xff09;所含的元素&#xff0c…

python类

一&#xff0c;类 1&#xff0c;类是摸板&#xff0c;里面有组合数据&#xff0c;实现功能的方法。 2&#xff0c;类里面有可以改变自身的方法__init__函数 3&#xff0c;类和模块类似&#xff0c;运行时创建&#xff0c;创建后修改 4&#xff0c;类成员通常是public&#xff…

关于Coursera视频不能播放问题

1&#xff0c;打开C:\Windows\System32\drivers\etc目录&#xff1b; 2&#xff0c;修改host文件&#xff0c;在最后添加52.84.246.72 d3c33hcgiwev3.cloudfront.net&#xff0c;保存&#xff1b; 3&#xff0c;重启浏览器或者刷新Coursera视频网址&#xff0c;搞定。

Web Form要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。”的解决办法。...

1.先将aspnet.scriptmanager.jquery.dl 复制到bin (网站根目录下的bin文件夹找不到&#xff0c;看看下面的图片中点击[显示所有文档]) 文件夹下。 2.在网站根目录下scripts文件夹,向里边添加jquery-1.7.2.min.js和jquery-1.7.2.js(可根据自己需要使用不同的版本&#xff09;…

python继承多重继承

一&#xff0c;基本语法 class MyClass(BaseClass):def __init__(self):print(...)class MyDefineClass(object):def __init__(self):print(继承自object类)MyDefineClass.__init__(None) # 属性访问 me MyDefineClass() # 实例对象 继承自object类 继承自object类 二&#x…

第14章 任务和特权级保护

学习这一章感觉异常的困难&#xff0c;所以学习从14-17章&#xff0c;每一章学扎实了&#xff0c;弄懂了每个问题再进行下一章&#xff0c;后一章都是在前一章的基础上增加一些数据结构和机制。另外读的时候可以各个击破&#xff0c;每次只搞明白一个小问题。读这一章可能需要两…

python 生成器推导式

# 生成器 generator 用yield来返回数据 def reverse(data):for i in range(len(data) - 1, -1, -1): # range(start, end, step) 不包括endyield data[i]def test_generator():for char in reverse(abc):print(char)# test_generator()c b a生成器表达式&#xff1a;与列表推导…

Windows XP系统安装SQL Server 2005(开发版)图解

转自Windows XP系统安装SQL Server 2005(开发版)图解 安装前提:由于有些从网上的下载的项目需要导入SQL Server 2005的数据文件&#xff0c;因此&#xff0c;今天便安装了这个数据库&#xff0c;我的系统中已经安装了SQL Server2000所以是在它之上安装SQL Server2005的。 一、数…

《软件工程(C编码实践篇)》课后感

Fibonacci&#xff08;与最后申请证书的姓名务必一致&#xff09; 原创作品 《软件工程&#xff08;C编码实践篇&#xff09;》MOOC课程http://mooc.study.163.com/course/USTC-1000002006 1&#xff08;20分&#xff09;软件工程&#xff08;C编码实践篇&#xff09;学习总…

用turtle画各种各样的数学图形

ps&#xff0c;用turtle导入小海龟来画图。画图代码都要导入海龟库哦&#xff0c;见下面第一行。 import turtle as t直线 # 画直线 def draw_line():pen t.Pen()pen.fd(200) # 直线默认水平方向 draw_line() 画正方形 def draw_square():pen t.Pen()for i in range(4): …

从网络字节流中提出整数

最近在做一个项目&#xff0c;就是设计一套通信协议&#xff0c;利用nginx来实现解析。协议内容是包括整数和字符串&#xff0c;现在客户端收到服务器端发送的网络字节流时&#xff0c;需要从中提取出整数&#xff0c;再根据整数决定发送数据量的大小。如下所示&#xff1a; p …

实验3 系统调用

系统调用 实验目的 建立对系统调用接口的深入认识掌握系统调用的基本过程能完成系统调用的全面控制为后续实验做准备 实验内容 此次实验的基本内容是&#xff1a;在Linux 0.11上添加两个系统调用&#xff0c;并编写两个简单的应用程序测试它们。 iam() 第一个系统调用是iam()&a…

python标准库(一)

操作系统接口os 切换目录 >>> import os>>> os.getcwd() # 得到当前工作目录C:\\Users>>> os.chdir(F:\\) # 切换工作目录到F盘>>> os.system(mkdir tody) # 在f盘创建一个叫tody的文件夹0import os 与 from os import * &#xff0c;要…

[Java] webservice soap,wsdl 例子

java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟&#xff0c;但要真正要用起来还需时日!! 由于毕业设计缘故&#xff0c;我看了很多关于webservice方面的知识&#xff0c;今天和大家一起来研究研究webservice的各种使用方法。 一、利用jdk web服务api…

C语言ASM汇编内嵌语法zz

朋友们&#xff0c;我是从http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html这里转载过来的&#xff0c;很不错就收藏了&#xff0c;如果转载&#xff0c;请注明初始链接。 .3 GCC Inline ASM GCC 支持在C/C代码中嵌入汇编代码&#xff0c;这些汇编代码被称作…

python标准库(二)

格式化输出 reprlib 库用来格式化 >>> import reprlib >>> reprlib.repr(set(aabbccddeeeff)) "{a, b, c, d, e, f}" >>>对集合能排序 >>> reprlib.repr(set(fdajfejaa)) "{a, d, e, f, j}" >>>pprint库用…

templates(0.1)

每一位 C 程序员都有自己的一套编程风格。这就引来了各种问题&#xff1a;哪儿应该 插入空白符号、怎么摆放分隔符&#xff08;大括号、小括号&#xff09;…等等。我们尽量保持全书风格一致&#xff0c; 当然有时候我们也对特殊问题作出让步。例如在教本&#xff08;初阶&…

实验4 进程运行轨迹的跟踪与统计

进程运行轨迹的跟踪与统计 难度系数&#xff1a;★★★☆☆ 实验目的 掌握Linux下的多进程编程技术&#xff1b;通过对进程运行轨迹的跟踪来形象化进程的概念&#xff1b;在进程运行轨迹跟踪的基础上进行相应的数据统计&#xff0c;从而能对进程调度算法进行实际的量化评价&…

虚拟环境创建,pip管理包

windows10虚拟环境的创建&#xff0c;pip管理包1.虚拟环境的创建1.1 为什么要创建虚拟环境1.2 创建虚拟环境1.3 激活虚拟环境1.3.1 激活方式1.3.2 检查是否创建成功2.用pip管理包2.1 pip的基本使用2.2 pip创建安装的文件requirements.txt2.3 安装包对应的版本2.4 用pip - r ins…

Linux C编程一些优秀的博客链接

1&#xff0c;C进程内存分布 https://www.cnblogs.com/fengyv/p/3789252.html 2&#xff0c;fork入门讲解 http://blog.csdn.net/jason314/article/details/5640969