第一章:最新版零基础学习 PYTHON 教程(第六节 - Python 中的命名空间和作用域)

2023-09-20 15:41:31

什么是命名空间:

命名空间是一个为 Python 中的每个对象都有唯一名称的系统。对象可能是变量或方法。Python 本身以 Python 字典的形式维护一个命名空间。让我们看一个例子,计算机中的目录文件系统结构。不用说,可以有多个目录,每个目录中都有一个同名的文件。但是,只要指定文件的绝对路径,就可以根据需要定向到该文件。 
实时的例子,命名空间的作用就像一个姓氏。人们可能在班级中找不到一个“Alice”,可能有多个“Alice”,但当你特别要求“Alice Lee”或“Alice Clark”(带有姓氏)时,只会有一个(暂时不要)不要认为多个学生的名字和姓氏都相同)。
类似地,Python 解释器根据命名空间来理解尝试在代码中指向的确切方法或变量。因此,单词本身的划分提供了更多的信息。它的名称(表示名称,唯一标识符)+空间(表示与范围相关的内容)。这里,名称可以是任何 Python 方法或变量,并且空间取决于尝试访问变量或方法的位置。
 

命名空间的类型:
 

当Python解释器单独运行而没有任何用户定义的模块、方法、类等时。一些函数如print()、id()始终存在,这些是内置的命名空间。当用户创建模块时,会创建全局命名空间,稍后创建本地函数会创建本地命名空间。内置命名空间包含全局命名空间,全局命名空间包含本地命名空间
 

命名空间的生命周期:
 

命名空间的生命周期取决于对象的范围,如果对象的范围结束,则该命名空间的生命周期也结束。因此,不可能从外部命名空间访问内部命名空间的对象。
 

例子: 

  • Python3
    # var1 在全局命名空间中
    var1 = 5
    
    def some_func():
    
    	# var2 在局部命名空间中
    	var2 = 6
    
    	def some_inner_func():
    
    		# var3 在嵌套的局部命名空间中
    		var3 = 7
    

    如下图所示,相同的对象名称可以出现在多个命名空间中,因为相同名称之间的隔离是由其命名空间维护的。

但在某些情况下,人们可能只对更新或处理全局变量感兴趣,如以下示例所示,应将其显式标记为全局变量并进行更新或处理。请注意,“count = count +1”行引用了全局变量,因此使用了全局变量,但请将其与写入“count = 1”的同一行进行比较。那么根据作用域规则,绝对需要“全局计数”行。

  • Python3
    # Python程序处理
    # 全局变量
    
    count = 5  # 定义全局变量count并赋值为5
    
    def some_method():
    	global count  # 使用global关键字声明要在函数中使用的全局变量count
    	count = count + 1  # 增加count的值
    	print(count)
    
    some_method()  # 调用函数some_method(),并打印count的值
    
    

    这段代码定义了一个全局变量count并赋值为5。然后,定义了一个名为some_method的函数,在函数内部使用global关键字声明要在函数中使用的全局变量count,并对其进行加1操作。最后,调用函数some_method(),打印count的值。

输出: 

6

Python 中对象的范围:
 

范围是指可访问特定 Python 对象的编码区域。因此,人们无法从代码的任何位置访问任何特定对象,访问必须得到对象范围的允许。
让我们举个例子来详细了解一下: 
 

示例1: 

  • Python3
    # Python程序展示
    # 对象的作用域
    
    def some_func():
    	print("在some_func函数内部")
    	def some_inner_func():
    		var = 10
    		print("在内部函数中,var的值为:", var)
    	some_inner_func()
    	print("尝试从外部函数打印var: ", var)
    some_func()
    

    这段代码定义了一个名为some_func的函数,在函数内部定义了另一个名为some_inner_func的函数。在some_inner_func内部,定义了一个局部变量var并赋值为10,然后打印了var的值。但是,在some_func函数的外部尝试打印var时,会引发NameError异常,因为var在外部函数的作用域之外不可见。

输出: 

在some_func函数内部
在内部函数中,var的值为: 10
Traceback (most recent call last):
  File "your_script.py", line 8, in <module>
    some_func()
  File "your_script.py", line 6, in some_func
    print("尝试从外部函数打印var: ", var)
NameError: name 'var' is not defined

这是代码的执行输出。首先,调用some_func函数,它打印了"在some_func函数内部"。然后,在some_func内部调用了some_inner_func,它打印了"在内部函数中,var的值为: 10"。

但是,在尝试从外部函数some_func打印var时,引发了NameError异常,因为var不在外部函数的作用域内可见。所以,最后一行代码无法执行。

更多推荐

ICCV 2023 | 沉浸式体验3D室内设计装修,基于三维布局可控生成最新技术

文章链接:https://arxiv.org/abs/2307.09621360°场景布局可控合成(360-degreeImageSynthesis)目前已成为三维计算机视觉领域一个非常有趣的研究方向,在虚拟三维空间中沉浸式的调整和摆放场景对象,可以为用户带来身临其境的感觉,非常适合应用在3D家居模拟装饰领域。本文提出

低代码提案管理应用:发挥员工“金点子”,小提案能有大作用

提案也称合理化建议,是制造企业实施精益管理的重要抓手。制造企业常常采用改善提案制度,引导和鼓励公司全体员工积极主动地提出任何能够改善企业经营质量、提高管理能力的建议。精益管理在日本丰田汽车公司发扬光大,提案管理也是如此。丰田的员工改善提案制度有超过50年的历史,据统计,1986年丰田公司合理化建议数为2,648,710

【SpringMVC】JSR303与拦截器的使用

文章目录一、JSR3031.1JSR303是什么1.2JSR303的好处包括1.3常用注解1.4实例1.4.1导入JSR303依赖1.4.2规则配置1.4.3编写校验方法1.4.4编写前端二、拦截器2.1拦截器是什么2.2拦截器与过滤器的区别2.3.应用场景2.4快速入门2.5.拦截器链2.6登录拦截权限案例2.6.1

Ajax基础笔记

Ajax(AsynchronousJavaScriptandXML)是一种用于在网页上实现异步通信的技术。它使得网页能够在不重新加载整个页面的情况下与服务器进行数据交换,实现了网页的动态更新,提升了用户体验。一、Ajax的工作原理使用JavaScript创建XMLHttpRequest对象,然后使用该对象向服务器发送H

软件测试/测试开发丨利用ChatGPT自动生成测试用例思维导图

点此获取更多相关资料简介思维导图是一种用图形方式表示思维和概念之间关系的工具:有些公司会使用思维导图编写测试用例,这样做的优点是:1.可视化和结构化。2.易于理解,提高效率。而ChatGPT是无法直接生成xmind格式的文件的,但是依然可以通过“曲线救国”的方式去编写思维导图格式的测试用例。实践演练那么如何让ChatG

线程安全问题的原因及解决方案

要想知道线程安全问题的原因及解决方案,首先得知道什么是线程安全,想给出一个线程安全的确切定义是复杂的,但我们可以这样认为:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。例如:使用两个线程分别对同一个变量进行修改,得出的结果与使用一个线程对这个变量进行修改的结果不同,

【推荐】SpringMVC与JSON数据返回及异常处理机制的使用

🎬艳艳耶✌️:个人主页🔥个人专栏:《【推荐】Spring与Mybatis集成整合》⛺️生活的理想,为了不断更新自己!1.JSON在SpringMVC中,JSON数据返回通常是通过使用`@ResponseBody`注解将Java对象转换为JSON格式,并直接发送给客户端。该注解可以用于Controller中的方法,用

【Unity基础】4.动画Animation

【Unity基础】4.动画Animation大家好,我是Lampard~~欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢(一)Unity动画编辑器(1)Animation组件这一张我们要学习如何在unity编辑器中,编辑一个动画。其中所使用到的组件是Animation,那什么是Animation组件呢?

耐蚀合金连续油管制造工艺 学习记录

声明本文是学习GB-T42858-2023耐蚀合金连续油管.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们5制造工艺5.1通则本文件所包含的合金应采用吹氧转炉冶炼或电炉冶炼或高炉冶炼(仅对马氏体或马氏体/铁素体不锈钢)或真空感应熔化工艺,并配合氩氧脱碳、真空氧气脱碳、真空电弧重熔、电渣重熔及真空电

服务网格和CI/CD集成:讨论服务网格在持续集成和持续交付中的应用。

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Hadoop:Hive操作(二):数据表操作,复杂数据类型,Sampling采样,虚拟列

数据表操作上接:Hadoop:YARN、MapReduce、Hive操作_独憩的博客-CSDN博客分桶表分桶表创建分区的作用可以把数据分成n个文件夹单独存放,而分桶表则可以把一个表的数据放在一个文件夹下,但是分成n个文件存放分区是将表拆分到不同的子文件夹中进行存储,而分桶是将表拆分到固定数量的不同文件中进行存储。分桶和

热文推荐