详解Python的作用域和命名空间

最近在学习Python,不得不说,Python真的是一门很好用的语言。但是学习的过程中关于变量作用域(scope)的命名空间(namespace)的问题真的把我给搞懵了。在查阅了相关资料之后,觉得自己对Python的作用域和命名空间有了一定得了解。故写在这里,一方面加深自己的理解,另一方面分享知识。

一、本篇博客需要解决的问题。

1、什么是作用域和命名空间?

2、Python中作用域和命名空间的工作原理是什么?

3、我怎样在Python中声明一个全局变量(global variable),局部变量(local variable)和nonlocal variable, which works between global scope and local scope?

4、如果我想让一个变量在多个Python脚本之间传递,我该怎么做?

二、解决问题

1、什么是作用域和命名空间?

命名空间是从名称到对象之间的映射。对象可以是Python脚本,函数,类等,也就是说Python中的每一个对象,都有其对应的命名空间。在不同的命名空间下声明相同名称的变量不冲突。

作用域是指Python程序运行时,一个命名空间相对应的作用范围的文本上的解释。英文原文为:A scope is a textual region of a Python program where a namespace is directly accessible. “Directly accessible” here means that an unqualified reference to a name attempts to find the name in the namespace.

2、Python中作用域和命名空间的工作原理是什么?

命名空间在不同的时间段被创建并且拥有不同的生命周期。有三种命名空间。

(1)、包含Python内置名称的命名空间。这种命名空间在Python编译器启动时被创建,在编译器关闭时销毁。

(2)、全局命名空间。即一个脚本文件(module)的命名空间。它在脚本文件被读取时创建,在编译器关闭时销毁。

(3)、局部命名空间。一般指一个函数的命名空间。在函数被调用时创建,在函数调用结束或者函数引发异常时销毁。

一个命名空间至少连接着三层相互嵌套的作用域。

(1)、the innermost scope,搜索变量时最先被搜索的作用域,包含local name

(2)、the scope of any enclosing functions,当(1)没有搜索到目标name时,就会向外扩张到一个封闭代码块或者函数的作用域,包含nonlocal name\nonglobal name

(3)、the next-to-last scope, 当(2)没有搜索到目标name时,搜索当前脚本和引用模块的name

(4)、the outermost scope,最后搜索的作用域,包含Python内置名称。

3、我怎样在Python中声明一个全局变量(global variable),局部变量(local variable)和nonlocal variable, which works between global scope and local scope?

Python中声明变量时,若前面不加关键字,这该变量默认为当前函数或代码块的局部变量

若前面加上global关键字,这意味着该变量是对一个全局变量的引用

若前面加上nonloca关键字,则意味着该变量是对中间层次作用域中的一个变量的引用

详情请看第三部分

4、如果我想让一个变量在多个Python脚本之间传递,我该怎么做?

简单。新建一个global.py脚本,把你需要用到的变量声明在里面,然后在需要用到这些变量的脚本里导入这个global.py脚本即可。

三、代码示例及相关解释

 1 # -*- coding: utf-8 -*-
 2 # author: zxr
 3 # time: 2019-04-07
 4 # functionality: test scope and namespace   # Python3.7.2
 5
 6 def scope_test():
 7     def do_local():
 8         spam = "local spam"
 9         print (spam)
10         def do_nonlocal():
11             nonlocal spam
12             spam = "do_local‘s nonlocal spam"
13         do_nonlocal()
14         print (spam)
15     def do_nonlocal():
16         nonlocal spam
17         spam = "nonlocal spam"
18     def do_global():
19         global spam
20         spam = "global spam"
21     spam = "test spam"
22     do_local()
23     print ("After local assignment, spam = " + spam)
24     do_nonlocal()
25     print ("After nonlocal assignment, spam = " + spam)
26     do_global()
27     print ("After global assignment, spam = " + spam)
28
29 if __name__ == ‘__main__‘:
30     scope_test()
31     print ("global spam = " + spam)

首先,调用scope_test函数的时候,scope_test.spam被声明,

然后,调用scope_test.do_local函数,scope_test.do_local.spam被声明

接着,调用scope_test.do_local.do_nonlocal函数,scope_test.do_local.spam被引用

接着,调用scope_test.do_nonlocal函数,scope_test.spam被引用

最后,调用scope_test.do_global函数,全局变量spam被声明

这段代码中,一定要仔细去理解每一个步骤,这样才能理解作用域和命名空间之间微妙的关系。

第一篇博客!

诚惶诚恐,希望有用!

若是无用,希望无害!

最后,如有不对的地方,欢迎大家批评指正!

原文地址:https://www.cnblogs.com/xianranzhang/p/10666781.html

时间: 2024-10-13 06:00:51

详解Python的作用域和命名空间的相关文章

centos7.0 安装日志--图文详解-python开发环境配置

centos7.0发布之后,就下载了everthing的DVD镜像,今天有时间,所以决定在vbox底下体验一番--- 上图: 默认是体验安装,作为一个忠实粉丝,我决定选择直接安装! 这个界面是这次新版本更新后改的,它把以前要下一步.上一步可以修改的操作全部集中到一个页面来,默认选择是下图这样,比如你想修改软件安装选项只要点击相应选项就可以了. 每次你更改安装选项之后,它都会自动从新计算安装源,如果你的选择的资源本地没有,还可以通过网络来安装,默认网络是不启用的,所以我们需要自己手工设置一下网络.

详解Python中re.sub--转载

[背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一下,在使用re.sub的时候,需要注意的一些事情. 解释具体的注意事项之前,先把其具体的解释贴出来: re.sub re.sub(pattern, repl, string, count=0, flags=0) Return the string obtained by replacing the

举例详解Python中的split()函数的使用方法

这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)os.path.split():按照路径将文件名和路径分割开 一.函数说明1.split()函数语法:str.

深入详解python传值问题及内存管理机制

在比较浅层次上我们通过说明如下问题来进一步深入了解python内存管理机制: python中到底是"传引用"还是"传值"呢??? 这个问题的回答是:看情况.有的是传值,有的是传引用. 判断的依据是看对象的可变性,而这一点又取决于对象的类型.故在python中的说法是对象可变的还是不可变的. 基本数据类型(整型及其他数据类型,字符串)及元组是不可变的,参数传递的是形参,也就是传过来的是原值的一个拷贝,在函数中改变形参的值实参不会发生变化: def func(a) 列表

详解python的垃圾回收机制

python的垃圾回收机制 一.引子 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存空间给回收掉,而变量名是访问到变量值的唯一方式,所以当一个变量值没有关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是一个垃圾会被python解释的垃圾回收机制自动回收 二.什么是垃圾回收机制 垃圾回收机制(简称GC)是python解释器自带的一种机制,专门用来回收不可用的变量值所占用的内存空间 三.为什么要用垃圾回收机制 程序运行过

详解 Python 中的下划线命名规则

在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单下划线(_)会在以下3种场景中使用: 1.1 在解释器中: 在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用. >>> _ Traceback (most recent call last): Fil

Python案例详解Python文件迭代的方法

在python开发中,我们常常都会用到迭代器,所以对于python初学者来说,必须掌握迭代器相关知识.本文小编就将为大家分享有关迭代器的相关知识,觉得有必要了解或加深了解的童鞋,请往下看. 1.迭代器介绍 可迭代对象:列表.元组.字符串 迭代工具:for循环.列表解析.in成员关系测试.map内建函数 下面,通过具体的例子,给大家展示一下: 1. >>> for item in (1,3,4,5): 2.   print(item) 3. 4. 1 5. 3 6. 4 7. 5 8. &

详解Python中的join()函数的用法

函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下:     join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串     os.path.join():  将多个路径组合后返回 一.函数说明 1.join()函数 语法:  'sep'.join(seq) 参数说明 sep:分隔符.可以为空 seq:要连接的元素序列.字符串.元组.字典 上面的语法即:以sep作为分隔符,将s

详解Python对象属性

在面向对象编程中,公开的数据成员可以在外部随意访问和修改,很难控制用户修改时新数据的合法性.解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私有数据成员时可以对值进行合法性检查,提高了程序的健壮性,保证了数据的完整性.属性结合了公开数据成员和成员方法的优点,既可以像成员方法那样对值进行必要的检查,又可以像数据成员一样灵活的访问. Python 2.x中属性的实现有很多不如人意的地方,在Python 3.x中,属性得到了较为完整的实现,支持