globals()、locals() 和 vars() 之间有什么区别?

2024-12-25 08:51:00
admin
原创
128
摘要:问题描述:globals()、locals()和之间有什么区别vars()?它们返回什么?结果更新有用吗?解决方案 1:每个都返回一本字典:globals() 总是返回模块命名空间的字典locals() 始终返回当前命名空间的字典vars()返回当前命名空间的字典(如果没有参数调用)或参数的字典。locals...

问题描述:

globals()locals()和之间有什么区别vars()?它们返回什么?结果更新有用吗?


解决方案 1:

每个都返回一本字典:

  • globals() 总是返回模块命名空间的字典

  • locals() 始终返回当前命名空间的字典

  • vars()返回当前命名空间的字典(如果没有参数调用)或参数的字典

locals并且vars可以使用更多解释。如果locals()在函数内部调用,它会使用当前局部变量命名空间(加上任何闭包变量)的值更新字典并返回它。locals()在同一个堆栈框架中多次调用每次都会返回同一个字典 - 它作为其属性附加到堆栈框架对象f_locals。字典的内容会在每次locals()调用和每次f_locals属性访问时更新,但在此类调用或属性访问时更新。分配变量时不会自动更新,并且分配字典中的条目不会分配相应的局部变量:

import inspect

def f():
    x = 1
    l = locals()
    print(l)
    locals()
    print(l)
    x = 2
    print(x, l['x'])
    l['x'] = 3
    print(x, l['x'])
    inspect.currentframe().f_locals
    print(x, l['x'])

f()

得到:

{'x': 1}
{'x': 1, 'l': {...}}
2 1
2 3
2 2

第一个print(l)只显示一个'x'条目,因为赋值l发生在调用之后locals()。第二个print(l),在locals()再次调用之后,显示一个l条目,尽管我们没有保存返回值。第三个和第四个print显示赋值变量不会更新l,反之亦然,但在我们访问之后f_locals,局部变量被再次复制到locals()

两点说明:

  1. 此行为是 CPython 特有的——其他 Python 可能允许更新自动返回到本地命名空间。

  2. 在 CPython 2.x 中,可以通过exec "pass"在函数中添加一行来实现这一点。这会将函数切换到较旧、较慢的执行模式,该模式使用字典locals()作为局部变量的规范表示。

如果在函数外部locals()调用,它将返回当前命名空间的实际字典。对命名空间的进一步更改反映在字典中,对字典的更改也反映在命名空间中:

class Test(object):
    a = 'one'
    b = 'two'
    huh = locals()
    c = 'three'
    huh['d'] = 'four'
    print huh

得到:

{
  'a': 'one',
  'b': 'two',
  'c': 'three',
  'd': 'four',
  'huh': {...},
  '__module__': '__main__',
}

到目前为止,我所说的一切locals()也适用于vars()……区别在于: vars()接受单个对象作为其参数,如果您给它一个对象,它将返回__dict__该对象的。对于典型的对象,它__dict__是存储其大多数属性数据的地方。这包括类变量和模块全局变量:

class Test(object):
    a = 'one'
    b = 'two'
    def frobber(self):
        print self.c
t = Test()
huh = vars(t)
huh['c'] = 'three'
t.frobber()

得到的结果为:

three

请注意,函数的__dict__命名空间是其属性,而不是局部变量。函数存储局部变量是没有意义的__dict__,因为递归和多线程意味着可以同时对一个函数进行多次调用,每个调用都有自己的局部变量:

def f(outer):
    if outer:
        f(False)
        print('Outer call locals:', locals())
        print('f.__dict__:', f.__dict__)
    else:
        print('Inner call locals:', locals())
        print('f.__dict__:', f.__dict__)

f.x = 3

f(True)

得到的结果为:

Inner call locals: {'outer': False}
f.__dict__: {'x': 3}
Outer call locals: {'outer': True}
f.__dict__: {'x': 3}

这里,f递归调用自身,因此内部调用和外部调用重叠。每个调用 时都会看到自己的局部变量locals(),但两个调用都会看到相同的f.__dict__,并且f.__dict__其中没有任何局部变量。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1989  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1446  
  在当今快速发展的IT行业中,项目管理工具的选择对于项目的成功至关重要。随着技术的不断进步,项目经理们需要更加高效、灵活的工具来应对复杂的项目需求。本文将介绍2025年IT项目经理力推的10款管理工具,帮助您在项目管理中取得更好的成果。信创国产项目管理软件 - 禅道禅道是一款国产开源的项目管理软件,禅道开源版不限人数,功...
项目管理工具   0  
  在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目成功的关键工具。随着技术的不断进步,市场上涌现出众多功能各异的项目管理工具,每一款都有其独特的优势和适用场景。本文将深入评测2025年最受欢迎的10款项目管理软件,帮助您根据自身需求做出明智的选择。信创国产项目管理软件 - 禅道禅道是一款...
项目管理平台   2  
  产品开发效率对于企业的竞争力至关重要。在当今复杂多变的商业环境中,如何有效提升产品开发效率成为众多企业关注的焦点。产品生命周期管理(PLM)作为一种整合产品全生命周期信息的管理理念和技术,为提升产品开发效率提供了有力的支持。通过合理运用PLM,企业能够优化流程、加强协作、提高数据管理水平,从而实现产品开发的高效运作。接...
plm开发流程软件   3  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用