【Python】globals和locals的一些细节向问题(十分细节,有些甚至平时都用不上

【未经本人同意不得私自转载】
【本文发布于CSDN,地址为:https://blog.csdn.net/weixin_44733774/article/details/124679359





  最近有小伙伴在使用exec和eval时碰到了一个问题,然后这个问题我也碰到过,本来想在评论里直接回复他的,但在组织语言的过程中发现要点太多了,还不如直接发篇博客。在解答在这个问题的过程中感觉还试出了不少奇怪的东西。

  因为代码片段太多了,贴在博客上的话排版会很难看(其实本来就很难看了),所以我把博客中出现的代码贴到gayhub上:https://github.com/Ls-Jan/Python_LanguageFeatures/tree/main/globals%2Blocals
  我py的版本是3.7.8。代码跑出问题的话有可能是版本差异造成的。




一、globals()和locals()

1、globals()返回全局变量,无论在哪都是返回同一个东西:


  听君一席话,如听一席话。简单的说就是,globals()在哪调用都是同一个东西
    




2、locals()返回局部变量,在不同地方是不同的东西

  再一次“如听一席话”。
    




3、dir()可以获取局部变量列表

  可以通过list(locals().keys())来获取当前局部变量列表,也可通过dir()获取。
    




4、locals()和它当前所处的递归调用栈的深度直接相关

  这个不知道怎么说明,直接看运行结果吧
    
  上面的运行结果表面看上去是“不同函数的locals()却是同一个”,但再看看下面的图就知道是怎么回事了
    


  然后就是,每次进入新调用时,其对应的locals()的内容都是全新的,所以别想着做些奇怪的事

    




5、【重点!】 对locals()进行修改并不会实际影响到解释器使用的变量

  这次是真的开眼了,被几个奇奇怪怪的问题折磨到睡着,醒来时头清醒了点然后试了几次虽然明白了点什么但还是觉得莫名其妙。
  ①、id(locals())变化理由不明
    
  ②、获取locals()的字典后其内容不会同步更新
    
  ③、返回的locals()中可以出现解释器中不存在的变量(但这没有一点意义
    

  被逼无奈只能去py官网查 locals() ,官方给出的答案是:别动它,动它并不会同步影响到解释器使用的局部变量或自由变量的值
  也就是,locals()你就当它是只读来使用就好了,别往深处想。
  然后就是,第4点指出的“locals()和它当前所处的递归调用栈的深度直接相关”就当它是废话吧,因为locals()返回的内容并不是十分严谨不能过于依赖它(而且对其内容进行修改没有意义)。




6、global关键词声明的变量将位于全局变量域中,否则会在局部变量域中

  这个应该不用怎么说明了,多试试自然就懂。
    




7、可以对globals()进行直接修改以影响全局变量

  这和global声明变量有点相似但又不同,只不过使用globals()可以直接删掉全局变量。
  相对globals()来说,locals()简直就是个废的,根本不能拿locals()做些什么建设性的操作。(虽然也没啥必要拿着locals()去干些什么大事
    

猜你喜欢

转载自blog.csdn.net/weixin_44733774/article/details/124679359