广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python3命名空间和作用域是什么
  • 372
分享到

Python3命名空间和作用域是什么

2023-06-02 01:06:48 372人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要讲解了“python3命名空间和作用域是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python3命名空间和作用域是什么”吧!命名空间命名空间(Namespace)是从名称

这篇文章主要讲解了“python3命名空间和作用域是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python3命名空间和作用域是什么”吧!

命名空间

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

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

我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。
Python3命名空间和作用域是什么
一般有三种命名空间:

内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
Python3命名空间和作用域是什么
命名空间查找顺序:

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

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

NameError: name 'runoob' is not defined。

命名空间的生命周期:

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

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

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

如下图所示,相同的对象名称可以存在于多个命名空间中。
Python3命名空间和作用域是什么

作用域

作用域就是一个 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。

在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
Python3命名空间和作用域是什么

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, inNameError: 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, intest()  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

感谢各位的阅读,以上就是“Python3命名空间和作用域是什么”的内容了,经过本文的学习后,相信大家对Python3命名空间和作用域是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Python3命名空间和作用域是什么

本文链接: https://www.lsjlt.com/news/228311.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python3命名空间和作用域是什么
    这篇文章主要讲解了“Python3命名空间和作用域是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python3命名空间和作用域是什么”吧!命名空间命名空间(Namespace)是从名称...
    99+
    2023-06-02
  • 命名空间和作用域
    一、命名空间 一、命名空间的分类: 1、内置命名空间——python解释器: python解释器启动就可以使用的名字存储在内置内存空间; 内置的名字在启动解释器的时候就被加载进内存,如input()、print()等等。 2、全局命名空间...
    99+
    2023-01-31
    作用 空间
  • Python函数命名空间和作用域是什么
    这篇文章主要介绍Python函数命名空间和作用域是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.Local作用域a = 100def func5():  &n...
    99+
    2023-06-29
  • Python 作用域和命名空间
    在介绍类之前,我首先要告诉你一些Python的作用域规则。类定义对命名空间有一些巧妙的技巧,你需要知道作用域和命名空间如何工作才能完全理解正在发生的事情。顺便说一下,关于这个主题的知识对任何高级Python程序员都很有用。 让我们从一些定...
    99+
    2023-01-31
    作用 空间 Python
  • php命名空间的作用是什么
    PHP命名空间的作用是避免命名冲突和提高代码的可读性。在PHP中,命名空间允许我们在代码中定义一个独特的标识符前缀,以避免与同样标识...
    99+
    2023-10-12
    php
  • C++命名空间的作用是什么
    C++命名空间的作用是解决命名冲突的问题。在C++中,可以使用命名空间将一组相关的变量、函数、类等封装起来,从而避免与其他代码中的同...
    99+
    2023-08-18
    C++
  • Python命名空间、作用域和装饰器怎么使用
    今天小编给大家分享一下Python命名空间、作用域和装饰器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、名称空间...
    99+
    2023-06-30
  • Python函数命名空间和作用域(Local与Global)
    目录1.Local作用域2.Enclosing function locals作用域3.Global全局变量4.非局部变量nonlocal5.就近原则6.函数执行顺序7.循环、判断代...
    99+
    2022-11-13
  • 什么是VB.NET命名空间
    这篇文章主要为大家展示了“什么是VB.NET命名空间”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“什么是VB.NET命名空间”这篇文章吧。对于命名组织在程序集中定义的对象你有深入的了解吗?程序集...
    99+
    2023-06-17
  • ADO.NET常用命名空间是什么
    这期内容当中小编将会给大家带来有关ADO.NET常用命名空间是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。命名空间(NameSpace)记录了对象的名称与所在的路径。使用ADO.NET中的对象时,必...
    99+
    2023-06-17
  • 域名和空间注册步骤是什么
    1. 选择域名和空间提供商:根据自己需求选择合适的域名和空间提供商,可以通过搜索引擎、口碑推荐等方式寻找。2. 查询域名是否可用:在...
    99+
    2023-06-07
    域名和空间 域名 空间
  • Python中的命名空间、作用域以及lo
          最近一直看一本python经典教材——《Python学习手册》,因为之前都是突击学的,也没有仔细看一些经典教材,所以感觉自己的基础掌握的还不是很好,虽然网络上资源多,但我觉得还是有必要买本教材来认真的读一读,底层基础决定上层建筑...
    99+
    2023-01-31
    作用 空间 Python
  • SAE空间域名绑定和域名跳转的方法是什么
    本篇内容介绍了“SAE空间域名绑定和域名跳转的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!域名绑定1、新浪SAE空间支持绑定独立...
    99+
    2023-06-10
  • 购买域名和空间的区别是什么
    购买域名和空间是建立网站的两个基本步骤,它们之间的区别如下:1、域名是网站的名称,空间是网站的存储空间。域名是网站的唯一标识符,用于...
    99+
    2023-03-21
    购买域名和空间 域名 空间
  • java中arraylist命名空间是什么
    Java中没有命名空间的概念,ArrayList是java.util包中的一个类。Java中没有命名空间的概念,但是可以使用包名来进...
    99+
    2023-05-31
    arraylist命名空间 arraylist
  • 空间域名购买流程是什么
    空间域名购买的流程通常如下:1、确定需求首先需要确定自己的需求,包括网站类型、流量预估、空间大小、域名等,以便选择合适的空间域名服务...
    99+
    2023-03-20
    空间域名购买 空间 域名
  • 域名空间注册流程是什么
    1、在域名注册商网站上输入想要注册的域名,查询该域名是否可以注册。2、如果该域名可以注册,需要填写相关的注册信息,包括域名所有者、注...
    99+
    2023-05-13
    域名空间注册 域名
  • 域名空间购买流程是什么
    1. 确定需要购买的域名空间:首先要确定自己需要购买的域名空间,包括容量大小、流量带宽等。2. 选择合适的服务商:根据自己的需求选择...
    99+
    2023-06-08
    域名空间购买 空间 域名
  • 域名空间注册步骤是什么
    1. 选择注册商:在选择域名注册商之前,您需要考虑以下因素:价格、可靠性、客户支持、域名管理工具等。选择一个可靠的注册商非常重要,因...
    99+
    2023-06-08
    域名空间注册 域名 空间
  • mybatis命名空间有什么用
    MyBatis命名空间的作用是用来标识和管理Mapper接口或Mapper XML文件中定义的SQL语句。通过使用命名空间,可以将不...
    99+
    2023-08-18
    mybatis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作