如何在Python中查找变量?

如何在Python中查找变量?,python,python-3.x,python-internals,Python,Python 3.x,Python Internals,我一直在试验Python,并观察到一些我不理解的行为 我认为在执行查找时会发生什么: 检查当前帧中的局部变量 如果找不到变量,请尝试第一个外部帧 重复1和2直到没有更多的外部帧,如果找不到变量,抛出namererror 这与print(x)的第一次调用一致,因为我已将x强制放入第一个外部框架 但是,第二次调用print(x)失败,出现namererror,这使我感到困惑,因为x存在于局部变量中 谢谢 import inspect def test(): frame_inner = i

我一直在试验Python,并观察到一些我不理解的行为

我认为在执行查找时会发生什么:

  • 检查当前帧中的局部变量
  • 如果找不到变量,请尝试第一个外部帧
  • 重复1和2直到没有更多的外部帧,如果找不到变量,抛出
    namererror
  • 这与
    print(x)
    的第一次调用一致,因为我已将
    x
    强制放入第一个外部框架

    但是,第二次调用
    print(x)
    失败,出现
    namererror
    ,这使我感到困惑,因为
    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()
    
    如果你看一下,你会发现所有的官方用法都是为了。。。检查值

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


    没有描述修改的安全性,您可以假设,如果您想修改此模块中的帧或其他内容,您可以自行修改。您所做的任何更改都不能保证传播回当前状态的内部表示。

    您读过吗?您会感到困惑,因为您正在修改
    f\u locals
    。这基本上是未定义的行为。修改
    locals()
    返回的
    dict
    不会影响解释器看到的局部变量。请参见此处:@juanpa.arrivillaga此代码不会修改
    locals()
    的返回。不过,它确实修改了帧的
    f_局部变量
    ,这也可能不是一个好主意。@viraptor
    locals
    返回
    frame.f_局部变量
    (至少在cpython中是这样)。作为进一步说明,我尝试在函数中调用
    test()
    ,但两次调用都失败了。因此,似乎inspect能够影响全局框架的变化,但不能影响局部框架的变化,这导致了我的困惑