命名空间和作用域

一,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,一经查实,立即删除!

相关文章

python类

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

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…

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

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

用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): …

实验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;要…

python标准库(二)

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

实验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…

vi文字处理器

http://blog.csdn.net/wangloveall/article/details/22649331 摘要&#xff1a;vi是类UNIX命令行接口的标准文字处理软件&#xff0c;也是进行shell脚本程序编写与服务器设置的非常重要的工具。本文介绍vi文字处理器&#xff0c;包括vi简介、vi怎么使用、vi的加强版vim。 关键词…

用numpy,matplotlib库画笛卡尔爱心曲线

1650年&#xff0c;斯德哥尔摩的街头&#xff0c;52岁的笛卡尔邂逅了18岁的瑞典公主克里斯汀。   那时&#xff0c;落魄、一文不名的笛卡尔过着乞讨的生活&#xff0c;全部的财产只有身上穿的破破烂烂的衣服和随身所带的几本数学书籍。生性清高的笛卡尔从来不开口请求路人施舍…

centos7虚拟机共享本机磁盘的方法

说明&#xff1a;这个方法不一定是通用的&#xff0c;也可能不是最快捷的&#xff0c;但是感觉比较稳妥的办法。 1&#xff0c;首先坚持两个进程是否启动&#xff1a;右击&#xff1a;我的电脑-管理-服务&#xff0c;检查server服务和Workstation服务是否启动。如果没有启动&a…

服务器小程序servlet的使用

servlet的创建使用一&#xff0c;三种创建方式1.1 实现servlet接口1.2 继承GenericServlet1.3 继承HttpServlet二&#xff0c;servlet使用2.1 web.xml文件的配置2.1.1 创建xml文件2.1.2 手写web.xml文件2.2 在8080端口下访问2.2.1 servlet的生命周期servlet是服务器小程序。是个…

el表达式,c标签的使用

el表达式的使用 学生类 public class Student {int id;String name;String sex;String birth;public Student() {}public Student(int id, String name, String sex, String birth) {super();this.id id;this.name name;this.sex sex;this.birth birth;}// el 表达式取实…

conda虚拟环境中安装ipython

问题&#xff1a;今天安装了tensorflow&#xff0c;启动ipython竟然提示如下&#xff1a; In [1]: import tensorflow as tf --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recen…

使用session保持登录状态,cookie保存用户账号密码

session保存登录状态与cookie保存账号密码1. session维持登录状态1.1 代码实现2. cookie保存账号密码2.1 什么是cookie2.2 cookie记住账号密码1. session维持登录状态 利用session的生命周期实现 1.1 代码实现 login页面表单部分 <form action"judgeLoginSession&qu…