python学习汇总40:命名空间和作用域及local,global,locals(),globals()区别 2018/11/16(推荐)tcy

本文主要是介绍python学习汇总40:命名空间和作用域及local,global,locals(),globals()区别 2018/11/16(推荐)tcy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

python命名空间和作用域及local,global,locals(),globals()区别 2018/11/16  
目录:
1.命名空间及作用域的基本概念1.1.模块级变量运用2.变量的作用域
3.local,global,locals(),globals()区别
loccals查看局部变量
globals查看修改删除全局变量
4.典型错误处理   
1.1.命名空间分类:全局命名空间:记录模块变量,包括函数、类、导入模块、模块级变量和常量
局部命名空间:函数,类,推导式名字空间叫做局部名字空间,记录参数和局部变量
内置命名空间:任何模块均可访问它,存放着内置函数异常
1.2.三种命名空间之间的加载与取值顺序:加载顺序:
内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)取值 ,查找变量顺序:
局部命名空间->全局命名空间->内置命名空间局部名字空间local 本地-  特指当前函数或类方法。
局部名字空间 Eclosing封闭-  函数体内定义函数
全局名字空间global全局 -  特指当前模块。
内置名字空间 built-in内置-  对每个模块都是全局的。注意:
import module:模块自身被导,保持自已名字空间;module.function在模块的命名空间中运用
from module import: 将module.function函数属性导入当前名字空间;可以直接使用 
1.3.python代码运行函数机理python解释器开始执行之后,在内存中开辟一个空间,当遇到一个变量时把变量名和值
之间对应关系记录下来。当遇到函数定义时解释器只是象征性将函数名读入内存,表示知
道这个函数存在,至于函数内部的变量和逻辑解释器根本不关心代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,
这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中变量只能在函数内部使用,随着函数执行完毕这块内存中所有内容被清空
在函数的运行中开辟的临时的空间叫做局部命名空间内置命名空间存放python解释器提供名字input print str list tuple.等.可直接使用。 
2.变量的作用域概念:
global变量:为全局作用域;
nonlocal变量:为封闭作用域,系统每次执行函数时会创建新的局部命名空间
globals()  :以字典类型返回当前位置的全部全局变量。
locals()  :以字典类型返回当前位置的全部局部变量
用途:
用于定义,查看,修改变量
注意:
1)golbal用于定义全局变量
2)nonlocal用于函数内定义局部变量
3)globals,locals函数用名字空间来记录变量轨迹;名字空间是一个字典 {变量名:变量值}
4)名字空间在运行时直接可以访问,可在命名空间中更改变量
(1)局部名字空间可通过内置locals函数访问; locals是只读 不可修改;locals()返回的拷贝;修改不影响局部名字空间中变量值
(2)全局(模块级别)名字空间可通过内置globals函数来访问;globals可以修改,返回全局名字空间;对他修改影响全局变量5).跨模块共享全局变量
在单个程序中跨模块共享信息的规范方式是创建一个特殊模块(通常称为config或cfg)。
只需在应用程序的所有模块中导入配置模块;  该模块将成为全局名称。由于每个模块只有
一个实例,因此对模块对象所做的任何更改都会反映到处。例如: config.py:
x = 0 # Default value of the 'x' configuration setting
mod.py:
import config
config.x = 1
main.py:
import config
import mod
print(config.x)

3.实例 : 

实例1-locals()查看局部变量
def add_tcy(a,b):
z=a+b
s=locals()
locals()['z'] = -100 # 修改局部名字空间拷贝变量无影响
return s['z'],z,sf=add_tcy(3,4) # (-100, 7, {'a': 3, 'b': 4, 'z': -100, 's': {...}})#z并未改变,改变的locals()拷贝的副本 
实例2-globals()查看修改删除全局变量
import os'name' in globals() #False
globals()['name']=os.getcwd()#'C:\\python37\\Scripts'
'name' in globals() #True
del globals()['name']
'name' in globals() # False 
实例3-globals()在命名空间中修改全局变量x,y=10,20
z=x+y
print(z)#30
globals()['x']=-100 # globals()修改变量x的值为-100
z=x+y
print(z)#80

4.实例:测试全局变量和局部变量 

显示函数定义: 
lst=[0,0]
def view_variable(locals,globals,lst=lst):
'''仅显示变量,去除其他显示'''def ChooseVariable(data):d={}for key,value in data.items():if ('__' not in key) and (not isinstance(value,dict)) and('lst' not in key):if 'function' in str(value):value='fun'd[key]=valuelst[1]=lst[1]+1lst[0]=(lst[0]+1) if (lst[1]%2)==0 else lst[0]return dprint('{}.1.locals={}'.format(lst[0],ChooseVariable(locals)))print('{}.2.globals={}'.format(lst[0],ChooseVariable(globals))) 
实例1:
g_x0=1 #全局作用域l=locals()
g=globals()
view_variable(l,g)
# 1.locals={'view_variable': 'fun', 'g_x0': 1}
# 2.globals={'view_variable': 'fun', 'g_x0': 1} 
实例2:测试全局变量和局部变量---闭包变量测试
g1=-1000
def test_func():V0=10 #作用域为test_func函数l = locals()g = globals()view_variable(l, g)# 0.1.locals={'V0': 10}# 0.2.globals={'view_variable': 'fun', 'g1': -1000, 'test_func': 'fun'}def local_func():V0 = 20 #作用域为本函数l = locals()g = globals()view_variable(l, g)# 1.1.locals={'V0': 20}# 1.2.globals={'view_variable': 'fun', 'g1': -1000, 'test_func': 'fun'}def nonlocal_func():nonlocal V0 #作用域为test_func函数内部V0=15l = locals()g = globals()view_variable(l, g)# 2.1.locals={'V0': 15}# 2.2.globals={'view_variable': 'fun', 'g1': -1000, 'test_func': 'fun'}def global_func():global V0 #新建global全局变量V0=-1l = locals()g = globals()view_variable(l, g)# 3.1.locals={}# 3.2.globals={'view_variable': 'fun', 'g1': -1000, 'test_func': 'fun', 'V0': -1}local_func()print("V0=:", V0) # V0=10nonlocal_func()print("V0=:", V0) #V0=15global_func()print("V0=", V0) #同名内部优先V0=15l = locals()g = globals()view_variable(l, g)# 4.1.locals={'V0': 15, 'local_func': 'fun', 'nonlocal_func': 'fun', 'global_func': 'fun'}# 4.2.globals={'view_variable': 'fun', 'g1': -1000, 'test_func': 'fun', 'V0': -1}测试调用
test_func()
print(V0) #V0=-1
l=locals()
g=globals()
view_variable(l,g)
# 5.1.locals={'view_variable': 'fun', 'g1': -1000, 'test_func': 'fun', 'V0': -1}
# 5.2.globals={'view_variable': 'fun', 'g1': -1000, 'test_func': 'fun', 'V0': -1}
5.错误处理:
实例1
def myFunction(param1=123,param2="Python"):# global myVarfor key,val in locals().items():print( "key==> (%s : %s)" % (key,str(val)))myVar = myVar + 1myVar = 27
myFunction(12,'Tom')
#缺省global myVar程序报错
#输出:
# key==> (param1 : 12)
# key==> (param2 : Tom)
#报错原因:局部赋值需要注意Python有如下假设,如果在函数体内的任何地方对变量赋值,则Python将名称添加到局部命名空间。
语句myVar = myVar + 1对名称myVar进行赋值,Python假设无论在何处发生赋值,myVar都是函数myFunction局部命名空间的一部分。
当Python尝试把1添加到myVar中时,该名称在局部命名空间中,但它没有关联值,因此报错。问题在于Python何时决定myVar出现在局部空间中,这发生在代码运行之前,即,在Python运行到函数定义之前。由于创建局部命名空间时
(代码实际运行之前)。Python会检查代码并填充局部命名空间。在Python运行那行代码前,就发现了对myVar的赋值,并把它添加到局部
命名空间中。当函数执行时,Python解释器认为myVar在局部命名空间中但没有值,所以会产生错误。解决办法:
如果在函数体内,使用global语句将变量声明为全局变量,那么Python不会为该变量在命名空间中创建局部名称。 
实例2:典型内部变量运用错误def a(x):print(x)def b():print(x) #报错,函数内赋值操作对外层变量屏蔽,无论赋值参数在本函数内部位置何处x = 20print(x)return bf=a(10)()
print(f)

解决办法 : 

def a(x):print(x)def b():nonlocal x  # python3 的 nonlocal 语句可以内部函数直接使用外部函数print(x) #报错,函数内赋值操作对外层变量屏蔽,无论赋值参数在本函数内部位置何处x = 20print(x)return bf=a(10)()
print(f)# 10
# 10
# 20
# None

这篇关于python学习汇总40:命名空间和作用域及local,global,locals(),globals()区别 2018/11/16(推荐)tcy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829116

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]