vuex的命名空间有哪些_Python3 命名空间和作用域

命名空间

先看看官方文档的一段话:

A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。

命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

8ee005370e7baccfb405fdad0ac12e8a.png

一般有三种命名空间:

  • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
  • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
e6a15329a91c9d9d99c4dda70c8251c7.png

命名空间查找顺序:

假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间

如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:

NameError: name 'runoob' is not defined。

命名空间的生命周期:

命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

因此,我们无法从外部命名空间访问内部命名空间的对象。

实例

# var1 是全局名称
var1 = 5def some_func():
# var2 是局部名称
var2 = 6def some_inner_func():
# var3 是内嵌的局部名称
var3 = 7

如下图所示,相同的对象名称可以存在于多个命名空间中。

dd275d1f40618a281b7fd35e3c9e3af3.png

作用域

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.

作用域就是一个 Python 程序可以直接访问命名空间的正文区域。

在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:

有四种作用域:

  • L(Local):最内层,包含局部变量,比如一个函数/方法内部。
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
  • G(Global):当前脚本的最外层,比如当前模块的全局变量。
  • B(Built-in): 包含了内建的变量/关键字等。,最后被搜索

规则顺序: L –> E –> G –>gt; B

在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

50a8cbfc937d37d593a7d86364d216b6.png
g_count = 0  # 全局作用域def outer():    o_count = 1  # 闭包函数外的函数中    def inner():        i_count = 2  # 局部作用域

内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:

>>> import builtins>>> dir(builtins)

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:

>>> if True:...  msg = 'I am from Runoob'... >>> msg'I am from Runoob'>>> 

实例中 msg 变量定义在 if 语句块中,但外部还是可以访问的。

如果将 msg 定义在函数中,则它就是局部变量,外部不能访问:

>>> def test():...     msg_inner = 'I am from Runoob'... >>> msg_innerTraceback (most recent call last):  File "", line 1, in NameError: name 'msg_inner' is not defined>>> 

从报错的信息上看,说明了 msg_inner 未定义,无法使用,因为它是局部变量,只有在函数内可以使用。

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

实例(Python 3.0+)

#!/usr/bin/python3 total = 0 # 这是一个全局变量# 可写函数说明def sum( arg1, arg2 ):    #返回2个参数的和."    total = arg1 + arg2 # total在这里是局部变量.    print ("函数内是局部变量 : ", total)    return total #调用sum函数sum( 10, 20 )print ("函数外是全局变量 : ", total)

以上实例输出结果:

函数内是局部变量 :  30函数外是全局变量 :  0

global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

以下实例修改全局变量 num:

实例(Python 3.0+)

#!/usr/bin/python3 num = 1def fun1():    global num  # 需要使用 global 关键字声明    print(num)     num = 123    print(num)fun1()print(num)

以上实例输出结果:

1123123

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:

实例(Python 3.0+)

#!/usr/bin/python3 def outer():    num = 10    def inner():        nonlocal num   # nonlocal关键字声明        num = 100        print(num)    inner()    print(num)outer()

以上实例输出结果:

100100

另外有一种特殊情况,假设下面这段代码被运行:

实例(Python 3.0+)

#!/usr/bin/python3 a = 10def test():    a = a + 1    print(a)test()

以上程序执行,报错信息如下:

Traceback (most recent call last):  File "test.py", line 7, in     test()  File "test.py", line 5, in test    a = a + 1UnboundLocalError: local variable 'a' referenced before assignment

错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。

修改 a 为全局变量,通过函数参数传递,可以正常执行输出结果为:

实例(Python 3.0+)

#!/usr/bin/python3 a = 10def test(a):    a = a + 1    print(a)test(a)

执行输出结果为:

11

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

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

相关文章

ajax实现翻书效果,jQuery实现手机版页面翻页效果的简单实例

var page 1;var size 6;var mark 0;var url "{pigcms{:U(Order/index, array(page>d%))}";var commentTpl \去评价\;var template \""))}">\\{store_name}\\\\""))}">\\ \\{create_time}\总价:¥…

yolo极大抑制_pytorch实现yolov3(4) 非极大值抑制nms

在上一篇里我们实现了forward函数.得到了prediction.此时预测出了特别多的box以及各种class probability,现在我们要从中过滤出我们最终的预测box.理解了yolov3的输出的格式及每一个位置的含义,并不难理解源码.我在阅读源码的过程中主要的困难在于对pytorch不熟悉,所以在这篇文…

抽象类可以生成自己的对象吗_大理石可以自己抛光吗?大理石自己抛光方法解答...

大理石可以自己抛光吗?大理石自己抛光方法解答。大理石只有经过抛光后,表面才会有更好的光泽和质感。具体抛光可以要求大理石抛光团队施工,也可以自己做。那么大理石自己抛光方法是什么呢?下面石大夫为您解答。大理石自己抛光方法…

ajax 参数带百分号,Ajax请求中带有IPv6地址后的百分号的问题

IPv6地址后的百分号:对于连入网络但没有IPv6路由器或DHCPv6服务器的IPv6客户端,它们始终使用fe80::/64链路本地网络地址。如果运行Windows的计算机中有多个网络适配器连接到不同的网段,可以在IP地址后加百分号和区域ID数字来区分不同的网络,如…

高中数学40分怎么办_高二数学不会,准高三该怎么办?40分到高考140如何逆袭?...

原标题:高二数学不会,准高三该怎么办?40分到高考140如何逆袭?高二,这个年级是有点尴尬的,适应了高一的学习,感觉高二学习没有了动力,离高考还远,于是有些孩子就开始了放任…

python识别人脸多种属性_深度学习人脸识别仅9行python代码实现?同时高效处理100张相片?...

随着人脸识别、视频结构化等计算视觉相关技术在安防、自动驾驶、手机等领域走向商业化应用阶段,计算视觉技术行业市场迎来大规模的爆发。伴随人脸识别、物体识别等分类、分割算法不断提升精度。计算视觉的核心算法深度学习算法日渐成熟,通过对输出与对应…

服务器可以装2个系统吗,云服务器可以装多个系统吗

云服务器可以装多个系统吗 内容精选换一换共享云硬盘是一种支持多个云服务器并发读写访问的数据块级存储设备,具备多挂载点、高并发性、高性能、高可靠性等特点。主要应用于需要支持集群、HA(High Available,指高可用集群)能力的关键企业应用场景&#x…

关卡 动画 蓝图 运行_UE4无缝过场动画

最近有个哥们给我看他们最近在做的一个游戏,其中有这样一段镜头https://www.zhihu.com/video/1171378736917364736运用到了一个很常用的过场方式,就是平时我们所说的无缝过场。过场动画不通过黑屏转换,而是通过运镜来代入。这是一种比较容易实…

python条件循环叠加_Python基础:条件判断与循环的两个要点

一、条件判断:Python中,条件判断用if语句实现,多个条件判断时用if...elif实现:看下面一段程序#python 3.3.5#test if...elifage 20if age > 6:print (teenager)elif age > 18:print (adult)else:print (kid)程序输出结果&a…

H3C批量收集服务器信息,H3C设备服务器采集参数认证过程(包含redfish和restfull协议)...

该脚本针对H3C服务器分别对redfish和restfull两种协议的认证方式进行测试,并合并。有三个类,分别是redfish协议测试、restfull协议测试、以及两个合并测试文章最后使用redfish模块简单进行认证访问测试。import requestsimport jsonrequests.packages.ur…

个推的appid是指什么_推箱子软件介绍→安卓下最专业的推箱子软件(推箱快手)...

俗语说:工欲善其事必先利其器目前各安卓系统下的应用市场有很多很多推箱子软件,除了soko推箱子软件比较好以外,其余没有任何一款软件是推箱子好手想去使用的,为什么呢?先说说soko这款软件好在哪儿?点推式推…

list转字符串_剑指offer 38——字符串的排列

本题主要在于对回溯的理解,优化时可以结合 java 特性,以及排列的一些知识。原题输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s "abc&…

v5系列服务器后面板不存在以下哪款指示,群晖RS10613xs+ NAS服务器后面板简介

群晖RS10613xs NAS服务器后面板简介群晖RS10613xs NAS服务器后面板简介:NAS服务器的后面板往往承担着数据的输入、输出,电影的输入,网络的传输,容量的扩展,电能的支持以及产品的散热等重要功能,看似简单的后面板往往是…

怎么判断冠词用a还是an_【语法微课堂】英语冠词的用法,学会这4点,轻松玩转a、an、the...

点击上方??蓝色字,轻松关注!Well begun is half done.良好的开端是成功的一半。准备了一下午,终于可以给大家更新了,给大家分享了冠词讲解的视频、音频和文字版,自行取用吧!?冠词讲解视频版(小提示&…

pb自定义控件 事件_Android WebView与下拉刷新控件滑动冲突的解决方法

使用WebView时一般会在外层使用下拉刷新控件如(SwipeRefreshLayout)。但是测试时会发现网页无法上拉,往上滑动就会触发下拉刷新控件的refresh事件。所以这里记录一下解决该问题的办法。1、通过webView.getScrollY() 的值来判断是否滚动到顶部private SwipeRefreshLa…

双路服务器cpu必须型号相同,双路主板存在使用不同型号的cpu之说吗?还是必须使用一模一样相同的cpu型号?...

双路主板不存在使用不同型号的cpu一说, 可以使用不同型号的cpu, 不过参数差别不能过大(例如处理器的架构差别)多路主板就是一种主从结构, 处理器之间是协同工作,由中间的高速总线实现两个处理器的配合,不存在处理器必须…

打开多个界面_如何创建用户界面

CANBusKit,是一款集成汽车总线开发、测试、分析的专业软件工具。本章内容主要介绍如何使用CBK_OpenPanel工具为CANBUSKIT 工程创建用户界面,本工具目前支持Vector的xvp格式的面板文件导入。首先是启动软件(试用版软件只能从CANBusKit软件界面中启动该软件…

python命令行解析_python命令行解析函数

sys.argv在终端运行python 1.py hahahimportsysprint(sys.argv) #[1.py, hahah]argparsePython的命令行解析模块,这是一个python的内置库,通过在程序中我们定义好的参数,argparse将会从sys.argv中解析出这些参数,并自动生成帮助和…

汤姆克兰西全境封锁服务器维护时间,汤姆克兰西全境封锁无法登录怎么解决 无法登录解决方法攻略...

《汤姆克兰西:全境封锁》是款大型射击游戏,这款游戏的画面十分的精致,在这款游戏中会有各种不同的任务,玩家要带着武器来进行射击。在游戏的时候很多玩家们都反映无法登录怎么解决?那么下面小编就为玩家们详细解说下关…

需要的依赖_三十而已:夫妻关系中需要的是坦诚和依赖

最近三十而已大热播,开始时很多人都看好顾佳和许幻山这一对,顾佳有才有颜,上得厅堂下得厨房,处理事情干净利索,是难得的贤内助。许幻山温柔帅气还有才,关键是还对老婆好,他们的组合可以说是很让…