当前位置:   article > 正文

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

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

3.实例 : 

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

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

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

解决办法 : 

  1. def a(x):
  2. print(x)
  3. def b():
  4. nonlocal x # python3 的 nonlocal 语句可以内部函数直接使用外部函数
  5. print(x) #报错,函数内赋值操作对外层变量屏蔽,无论赋值参数在本函数内部位置何处
  6. x = 20
  7. print(x)
  8. return b
  9. f=a(10)()
  10. print(f)
  11. # 10
  12. # 10
  13. # 20
  14. # None
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/448745
推荐阅读
相关标签
  

闽ICP备14008679号