纯净、安全、绿色的下载网站

首页

当前位置:首页IT学院IT技术

Python locals globals Python内置函数locals和globals对比

道法自然﹑   2021-04-22 我要评论

这两个函数主要提供基于字典的访问局部和全局变量的方式在理解这两个函数时首先来理解一下python中的名字空间概念Python使用叫做名字空间的东西来记录变量的轨迹名字空间只是一个字典它的键字就是变量名字典的值就是那些变量的值实际上名字空间可以象Python的字典一样进行访问

每个函数都有着自已的名字空间叫做局部名字空间它记录了函数的变量包括函数的参数和局部定义的变量每个模块拥有它自已的名字空间叫做全局名字空间它记录了模块的变量包括函数、类、其它导入的模块、模块级的变量和常量还有就是内置名字空间任何模块均可访问它它存放着内置的函数和异常

当一行代码要使用变量 x 的值时Python会到所有可用的名字空间去查找变量按照如下顺序:

1.局部名字空间 - 特指当前函数或类的方法如果函数定义了一个局部变量 xPython将使用这个变量然后停止搜索

2.全局名字空间 - 特指当前的模块如果模块定义了一个名为 x 的变量函数或类Python 将使用这个变量然后停止搜索

3.内置名字空间 - 对每个模块都是全局的作为最后的尝试Python将假设 x 是内置函数或变量

如果Python在这些名字空间找不到 x它将放弃查找并引发一个 NameError 的异常同时传递There is no variable named 'x' 这样一条信息

#局部变量函数locals例子(locals 返回一个名字/值对的字典):

def foo(arg, a):
    x = 1
    y = 'xxxxxx'
    for i in range(10):
        j = 1
        k = i
    print(locals())
#调用函数的打印结果
foo(1,2)
[python@master test]$ python3 f.py 
{'arg': 1, 'a': 2, 'x': 1, 'y': 'xxxxxx', 'i': 9, 'j': 1, 'k': 9}

locals 是只读的,不可修改 而globals可以修改原因是:

locals()实际上没有返回局部名字空间它返回的是一个拷贝所以对它进行修改修改的是拷贝而对实际的局部名字空间中的变量值并无影响

globals()返回的是实际的全局名字空间而不是一个拷贝: 与 locals 的行为完全相反

所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量的取值

#coding:utf-8  
'''This is my first python program!'''  
z = 7 #定义全局变量 
def foo(arg):  
  x = 1  
  print(locals()) 
  print ('x=',x) 
  locals()['x'] = 2 #修改的是局部名字空间的拷贝而实际的局部名字空间中的变量值并无影响 
  print(locals()) 
  print("x=",x)
 
foo(3)  
print(globals()) 
print('z=',z) 
globals()["z"] = 8 #globals()返回的是实际的全局名字空间修改变量z的值 
print(globals()) 
print("z=",z) 
[python@master test]$ python3 h.py 
{'arg': 3, 'x': 1}
x= 1
{'arg': 3, 'x': 1}
x= 1
{'__name__': '__main__', '__doc__': 'This is my first python program!', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fb2f23db400>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'h.py', '__cached__': None, 'z': 7, 'foo': <function foo at 0x7fb2f245d1e0>}
z= 7
{'__name__': '__main__', '__doc__': 'This is my first python program!', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fb2f23db400>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'h.py', '__cached__': None, 'z': 8, 'foo': <function foo at 0x7fb2f245d1e0>}
z= 8

相关文章

猜您喜欢

  • Android实体类entity Android项目中实体类entity的作用详解

    想了解Android项目中实体类entity的作用详解的相关内容吗阿德0307在本文为您仔细讲解Android实体类entity的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Android,实体类,entity下面大家一起来学习吧..
  • Eclipse IDE支持Java14 Eclipse IDE可支持Java 14編程

    想了解Eclipse IDE可支持Java 14編程的相关内容吗Way Lau在本文为您仔细讲解Eclipse IDE支持Java14的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Eclipse,IDE支持Java14下面大家一起来学习吧..

网友评论

Copyright 2022 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们