如何在Python中查找变量?

时间:2018-02-18 23:01:38

标签: python python-3.x python-internals

我一直在尝试使用Python,并观察了一些我不理解的行为。

我认为在进行查询时会发生什么:

  1. 检查当前帧中的局部变量
  2. 如果找不到变量,请尝试第一个外框
  3. 重复1和2,直到没有外框,如果找不到变量,则抛出NameError
  4. 这与print(x)的第一次调用一致,因为我强制x进入第一个外框。

    然而,print(x)的第二次调用失败了NameError,这使我感到困惑,因为x存在于局部变量中。

    谢谢!

    import inspect
    
    def test():
    
        frame_inner = inspect.currentframe()
        print(locals())  # { 'frame_inner': A }
    
        frame_outer = inspect.getouterframes(frame_inner)[1].frame
        y = 'y'
    
        frame_outer.f_locals['x'] = 'x'
    
        print(locals()) # { 'frame_inner': A, 'frame_outer': B, 'y': 'y' }
        print(y)        # y
        print(x)        # x
    
        del frame_outer.f_locals['x']
    
        frame_inner.f_locals['x'] = 'x'
    
        print(locals()) # { 'frame_inner': A, 'frame_outer': B, 'y': 'y', 'x': 'x' }
        print(y)        # y
        print(x)        # NameError: name 'x' is not defined
    
    
    test()
    

1 个答案:

答案 0 :(得分:2)

如果查看https://docs.python.org/3/library/inspect.html,您会发现所有官方用法都是......检查数值。

  

inspect模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。

没有描述修改的安全性,你可以假设如果你想修改你从这个模块得到的框架或其他东西,你就可以自己动手了。您所做的任何更改都不会保证传播回当前状态的内部表示。