如何在Python中查找变量?
我一直在试验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
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_局部变量
,这也可能不是一个好主意。@viraptorlocals
返回frame.f_局部变量
(至少在cpython中是这样)。作为进一步说明,我尝试在函数中调用test()
,但两次调用都失败了。因此,似乎inspect能够影响全局框架的变化,但不能影响局部框架的变化,这导致了我的困惑