Python基础-作用域和命名空间(Scope and Namespace)

在Python中,对象是独立的,不同作用域中的不同名字都可以被绑定在同一个对象上,当然对这个对象的修改会影响所有的引用。赋值操作就是名字和对象的绑定或重绑定。这和C++中的引用是一样的。

1,基础概念

1.1 命名空间(namespace)  

namespace is a mapping from names to objects

命名空间是名字和对象的映射。也就是可以把一个namespace理解为一个字典,实际上很多当前的Python实现namespace就是用的字典。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

那么哪些可以是一个namespace呢,比如Python的built-in names(包括内置函数,内置常量,内置类型);一个模块的global names(这个模块定义的函数,类,变量);一个函数的所有local names;还有一个类对象的所有属性(数据成员,成员函数)都组成一个命名空间。

命名空间都是有创建时间和生存期的。对于Python built-in names组成的命名空间,它在Python解释器启动的时候被创建,在解释器退出的时候才被删除;对于一个Python模块的global namespace,它在这个module被import的时候创建,在解释器退出的时候退出;对于一个函数的local namespace,它在函数每次被调用的时候创建,函数返回的时候被删除。

[总结]一个模块的引入,函数的调用,类的定义都会引入命名空间,函数中的再定义函数,类中的成员函数定义会在局部namespace中再次引入局部namespace。

 

1.2 作用域(scope)  

scope is a textual region of a Python program where a namespace is directly accessible.

作用域是Python程序(文本)的某一段或某些段,在这些地方,某个命名空间中的名字可以被直接引用。这个作用域就是这个命名空间的作用域。

一个Python程序的几个作用域:

  1. 最里面的局部作用域
  2. 外层函数的局部作用域
  3. 模块的全局作用域
  4. 包含Python内置对象的最外层作用域

 

关于作用域,参加Python基础-函数这片博客中2小节的例子。

 

1.3 赋值(assignment)  

Assignments do not copy data — they just bind names to objects.

赋值操作不会拷贝,只是把名字和对象做一个绑定。也就是赋值语句是起一个绑定或重绑定的作用(bind or rebind)。函数调用的参数传递是赋值,不是拷贝。

 

2,global和nonlocal语句

global语句用来声明一系列变量,这些变量会引用到当前模块的全局命名空间的变量(module-level namespace),如果该变量没有定义,也会在全局空间中添加这个变量。

global var1, var2

 nonlocal语句(nonlocal是Python3.2引入的)

Python2.7中还没有nonlocal语句。nonlocal语句用来声明一系列的变量,这个声明会从声明处从里到外的namespace去搜寻这个变量(the nearest enclosing scope),直到模块的全局域(不包括全局域),找到了则引用这个命名空间的这个名字和对象,若作赋值操作,则直接改变外层域中的这个名字的绑定。nonlocal语句声明的变量不会在当前scope的namespace字典中加入一个key-value对,如果在外层域中没有找到,则如下报错。

>>>SyntaxError: no binding for nonlocal 'spam' found

 

 一个nonlocal和global的测试例子

 1 def test():
 2     def do_local():
 3         spam = "local spam"
 4     def do_nonlocal():
 5         nonlocal spam    
6
spam = "nonlocal spam" 7 def do_global(): 8 global spam 9 spam = "global spam" 10 spam = "test spam" 11 do_local() 12 print("after local assignment:", spam) #输出:test spam 13 do_nonlocal() 14 print("after nonlocal asssignment:", spam) #输出:nonlocal spam 15 do_global() 16 print("after global assignment:", spam) #输出:nonlocal spam 17 18 test() 19 print("in global scope:", spam) #输出:global spam

第5行的语句:nonlocal spam 没有在函数do_nonlocal()的域中创建一个变量,而是去引用到了外层的,10行定义的spam。

第8行的global spam,在全局域中创建了一个name,9行将其绑定在字符串常量对象"global spam"上。

 

跟进一步测试nonlocal

 1 def test():
 2     def do_nonlocal():
 3         nonlocal spam
 4         def do_nonlocal2():
 5             nonlocal spam
 6             spam = "nonlocal2 spam"  #修改了test()中spam的绑定
 7         do_nonlocal2()
 8     spam = "test spam"
 9     do_nonlocal()
10     print("after nonlocal2 asssignment:", spam)  #输出:nonlocal2 spam
11 test()

do_nonlocal2()中的spam引用的是其外面的二层,也就是test()函数域中的spam。

 

 

参考:

http://docs.python.org/3.3/tutorial/classes.html#python-scopes-and-namespaces   Python文档

http://docs.python.org/3.2/reference/simple_stmts.html  Python文档-simple statement

转载于:https://www.cnblogs.com/livingintruth/p/3296010.html

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

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

相关文章

android 动画 返回,Android“菜单图标变返回”动画

此例用到SVG动画,其中涉及三个XML文件,分别为:Vector矢量图,objectAnimator动画,以及一个animated-vector文件将前两个文件联合起来。1.在drawable文件夹下新建vector文件描述矢量图android:height"200dp"an…

TI Sitara AM335x系统之AM335x uboot spl分析

本文转载自nidetech的Blog芯片到uboot启动流程ROM → SPL→ uboot.img简介在335x 中ROM code是第一级的bootlader。mpu上电后将会自动执行这里的代码,完成部分初始化和引导第二级的bootlader,第二级的bootlader引导第三级bootader,在ti官方上…

安装vs2017出现闪退现象_二、vs2017出现闪退问题解决办法

1、出现“Project1.exe”(Win32): 已加载“C:\Users\Administrator\Documents\Visual Studio 2017\Projects\Project1\Debug\Project1.exe”。已加载符号。“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。“Project1.exe”(Win3…

Shell程序荟萃

--------------纯输出----------------1.sh #!/bin/shecho -e "Hello!world!\a\n"exit 0 --------------获得用户输入----------------2.sh #!/bin/shread -p "Please input your name:" nameecho -e "\nHello!$name"exit 0 --------------日期计…

android 安装第三方app,Android识别预装的第三方App方法实例

前言新买一台手机,里面会有很多App,有的属于系统App,不可卸载,有的属于第三方App,厂商会预装一些常用的或者给了他们广告费的App,这些是可以卸载的。如果要详细划分,系统App还可根据其路径不同进…

汽车动力电池

1 CE SMPS 1.1 术语 DSCG:Discharge,VBUS下拉放电电阻 flyback:反激 forward:正激 LISN:Line Impedance Stabilization Network SMPS:Switching Mode Power Supplies,开关电源的变压器在整流桥之…

mysql 碎片率_计算MySQL表碎片的SQL整理

原标题:计算MySQL表碎片的SQL整理这是学习笔记的第 2111 篇文章在之前整理过一版MySQL的数据字典,整理了一圈,发现远比想象的复杂。当然整理的过程不光是知识梳理的过程,也是转化为实践场景的一个过程,通过这样一个体系…

全志A10 Bootload加载过程分析

A10的启动过程大概可分为5步:BootRom,SPL,Uboot,Kernel,RootFileSystem。本文只关注镜像的加载过程,分析RootRom->SPL->Uboot的启动流程。系统上电后,ARM处理器在复位时从地址0x000000开始…

android老 电池,为什么安卓手机不会因为电池的老化而降频呢?

前段时间,苹果手机的降频事件也是闹的沸沸扬扬,库克也为此进行了公开道歉,各位的吃瓜群众也是看的不亦乐乎,于是,也有不少的小伙伴会问:“为什么安卓手机不会因为电池的老化而降频?”今天&#…

华为笔记本软件商店_华为应用市场电脑版

华为应用市场电脑版是一款手机自带的应用商店下载中心,华为应用市场电脑版能够为用户提供新鲜、好玩的Android应用,华为应用市场电脑版能完美运行的应用和游戏,软件拥有独家“一键安装”的功能,它拥有智能搜索引擎,它也…

解决bbb无法加载uImage问题

使用sdk6,emmc的烧写都完成后,uboot启动后,无法加载uImage。 修改u-boot include/configs/am335x_evm.h的 CONFIG_EXTRA_ENV_SETTINGS 环境变量设置 将mmcdev0改为1即可 因为bbb上面,emmc是在mmc1上面,sd卡是在m…

修改spfile位置

虽然很多地方不建议这么做,可是有HA、oracle软件建在本地盘的情况下,如果spfile放在dbs下,会导致每次修改spfile都要去手动copy到备机上,这是很麻烦的一件事情,所以我把spflie放在随ha切换的存储磁盘上。 (…

android 解析错误 真机,AndroidStudio使用真机调试时出的一些bug

文章目录说明高德地图报错 - 错误代码7, key错误OPPO/VIVO手机安装时包解析错误说明此处记录一些这种情况的bug : 在用正式签名打包上线使用的时候没问题, 但是使用USB安装调试的时候会有的bug .高德地图报错 - 错误代码7, key错误场景 : 使用AndroidStudio开发,项目…

mybatis plug 只查id_Mybatis一对多/多对多查询时只查出了一条数据

问题描述:如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据。三个表,权限表(Permission),权限组表(PermissionGroup),权限组与权限的关系表(Permission…

Javascript设置对象属性为只读

有时为了保护某些属性,让其无法被更改,我们会把他们设置为常量。 在某些语言里面,也许会用const来实现这样的功能。本文讲述如何在Javascript中实现这样的功能。 方法一: var myObject {get readOnlyProperty() { return 1024; } };alert(my…

linux下gsoap的初次使用 (c)

这两天,接到一个项目,需要在linux程序中调用远程的web应用,通过soap协议。开始上网查了下资料,发现了gsoap库这个好东东^_^。继续在网上搜索例子代码,发现基本都不可编译通过,于是便一边学习一边写了这个最…

android 5.0.1 libdvm.so,Android逆向进阶—— 脱壳的奥义(基ART模式下的dump)

本文作者:i春秋作家HAI_ZHU000 前言市面上的资料大多都是基于Dalvik模式的dump,所以这此准备搞一个ART模式下的dump。Dalvik模式是Android 4.4及其以下采用的模式,之后到了Android 5.0 之后就是ART模式,关于这两个模式的详细内容&…

python bunch制作可导入数据_Python bunch包_程序模块 - PyPI - Python中文网

bunch是一个支持属性样式访问的字典,一个la javascript。>>> b Bunch()>>> b.hello world>>> b.helloworld>>> b[hello] "!">>> b.helloworld!>>> b.foo Bunch(lolTrue)>>> b.foo.lo…

浪潮之巅 笔记

14.2 诺威格(Peter Norvig,Google研究院主任,ACM Fellow,人工智能专家)定理:当一个公司的市场占有率超过50%后,就无法再使市场占有率翻翻了。在一个市场占有主导地位的公司必须不断开拓新的财源,才能做到长…

Linux下gSOAP的使用 (c++)

1、下载gSOAP在gSOAP官网中可以找到最新的gSOAP安装包以及相关的文档gSOAP官网:http://www.cs.fsu.edu/~engelen/soap.htmlgSOAP下载地址:http://sourceforge.net/projects/gsoap2/files/ 2、安装gSOAPa、解压zip压缩包命令:unzip gsoap_2.7.…