Python使用叫做命名空间的东西来记录变量的轨迹。命名空间只是一个 字典,它的键字就是变量名,字典的值就是那些变量的值。实际上,命名空间可以象Python的字典一样进行访问,一会我们就会看到。

在一个Python程序中的任何一个地方,都存在几个可用的命名空间。每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括 函数的参数和局部定义的变量。每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常 量。还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。

当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:
L:本地的(local),特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。

E:封闭的(Eclosing):在函数体内定义了一个新的函数。
G:全局的(Global):特指当前的模块。如果模块定义了一个名为 x
的变量,函数或类,Python将使用这个变量然后停止搜索。
B:内置的(Built-in):对每个模块都是全局的。作为最后的尝试,Python将假设 x
是内置函数或变量。

如果Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 的异常,同时传 递 There is no variable
named ‘x’ 这样一条信息
像Python中的许多事情一样,名字空间在运行时直接可以访问。特别地,局部名字空间可以通过内置的 locals
函数来访问。全局(模块级别)名字空间可以通过 globals 函数来访问。两个返回的都是字典dict类型。

globals 函数返回一个全局变量的字典,包括所有导入的变量。

输出:

locals() 返回是当前局部变量的深拷贝,修改locals()
中变量值的时候,实际上对于原变量本身是没有任何影响的。而globals()返回的是全局变量的字典,修改其中的内容,值会真正的发生改变。

将会报错:

原因如下:
Python有如下假设,如果在函数体内的任何地方对变量赋值,则Python将名称添加到局部命名空间。语句myVar=myVar +
1对名称myVar进行赋值,Python假设无论在何处发生赋值,myVar都是函数myFunction局部命名空间的一部分。当Python尝试把1添加到myVar中时,学雅思要多久该名称在局部命名空间中,但它没有关联值,因此报错。

问题在于Python何时决定myVar出现在局部空间中,这发生在代码运行之前,即,在Python运行到函数定义之前。由于创建局部命名空间时(代码实际运行之前)。Python会检查代码并填充局部命名空间。在Python运行那行代码前,就发现了对myVar的赋值,并把它添加到局部命名空间中。当函数执行时,Python解释器认为myVar在局部命名空间中但没有值,所以会产生错误。

解决办法:如果在函数体内,使用global语句将变量声明为全局变量,那么Python不会为该变量在命名空间中创建局部名称。

Python命名空间——locals()函数和globals()函数及局部赋值规则的更多相关文章

  1. Python globals() 函数

    Python globals() 函数  Python 内置函数 描述 globals() 函数会以字典类型返回当前位置的全部全局变量. 语法 globals() 函数语法: globals() 参数 ...

  2. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  3. python命名空间与作用域

    python命名空间与作用域   命名空间是名称与对象之间的关系,可以将命名空间看做是字典,其中的键是名称,值是对象. 命名空间不共享名称. 在命名空间中的名称能将任何python对象作为值,在不同的 ...

  4. Python 基础之返回值与函数使用与局部变量和全局变量locals() 和 globals()

    一.函数的返回值 return return: 自定义返回值,返回到哪里? 返回到函数的[调用处]1.return 后面可以跟上六个标准数据类型,除此之外,可以跟上 类对象,函数,如果不写return ...

  5. python中locals和globals函数

    参考:http://www.cnblogs.com/wanxsb/archive/2013/05/07/3064783.html Python有两个内置的函数,locals() 和globals(), ...

  6. 解读Python中 locals() 和 globals() 内置函数

    首先globals() 和 locals() 是作用于作用域下的内置函数,所以我将它们分为作用域类型的内置函数 1.作用域相关: 1)globals() # 返回全局作用域中的所有名字 2)local ...

  7. Python学习日记day10------函数的命名空间、作用域与闭合函数

    1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...

  8. Python:函数的命名空间、作用域与闭合函数

    1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...

  9. Python的locals()函数

    Python的locals()函数会以dict类型返回当前位置的全部局部变量. 示例代码: def func(): arg_a, arg_b = 'a', 'b' def func_a(): pass ...

随机推荐

  1. XSS challenges靶机

    第一关 <script>alert(123)</script> "><svg onload=alert(123)> 第二关 <script&g ...

  2. SpringBoot @ModelAttribute 用法

    前言 项目中遇到这么一个使用场景,用户的登录信息给予token保存,在需要有登录信息的地方,每次都要去获取用户Id,但每次在请求方法中去获取用户信息,代码重复,冗余,很low于是想到了用@ModelA ...

  3. 【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)

    前提介绍 Feign是SpringCloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用. 由于遗留原因,某些项目中,整个系统并不是SpringCloud项目,甚至不是Spri ...

  4. 如何从二维平面n个点中寻找距离最近两个点?

    如何理解分治算法 什么是分治算法?简单来说就是"分而治之",也就是将原问题划分成n个规模较小的,并且结构与原问题相似的子问题,然后去递归地解决这些子问题,最后再合并其结果,就得到原 ...

  5. 蓝凌OA前台任意文件读取漏洞利用

    近期CNVD爆出漏洞编号:CNVD-2021-28277,首次公开日期为2021-04-15,蓝凌oa存在多个漏洞,攻击者可利用该漏洞获取服务器控制权.今天挑选一个蓝凌OA前台任意文件读取漏洞进行分析 ...

  6. Flutter集成高德定位和地图功能

    定位集成 配置高德定位依赖库 新建 Flutter 项目,使用 Android Studio 打开项目里的 android 工程,或者右键 android 目录-> flutter -> ...

  7. OpenGL学习笔记(六)坐标系统

    目录 一.衔接 二.概述 三.各个坐标系统 局部空间 世界空间 观察空间 裁剪空间 四.两种投影矩阵 正射投影 透视投影 五.把它们都组合到一起 六.编码实现 1. 实现卡片旋转 2. 实现正方体旋转 ...

  8. PTui又加全景图 佳田未来城 of 安阳

    今天我又拍了张360°无死角全景,因为我发现这种照片非常具有纪念意义,一个全景能胜过一千张照片. 我上一次的全景的地址:http://www.dushangself.site/dslab/?id=8 ...

  9. JavaScript学习02(js快速入门)

    快速入门 基本语法 JavaScript的语法和Java的语法类似,每个语句以;结束,语句块用{...}.但是JavaScrip并不强制要求在每个语句的结尾加;,浏览器中负责执行JavaScript代 ...

  10. 【笔记】特征脸(PCA在人脸识别领域的应用)

    人脸识别与特征脸(简单介绍) 什么是特征脸 特征脸(Eigenface)是指用于机器视觉领域中的人脸识别问题的一组特征向量,该方法被认为是第一种有效的人脸识别方法. PCA的具体实现思想见 [笔记]主 ...