我一直在尝试使用Python,并观察了一些我不理解的行为。
我认为在进行查询时会发生什么:
NameError
这与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()
答案 0 :(得分:2)
如果查看https://docs.python.org/3/library/inspect.html,您会发现所有官方用法都是......检查数值。
inspect模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。
没有描述修改的安全性,你可以假设如果你想修改你从这个模块得到的框架或其他东西,你就可以自己动手了。您所做的任何更改都不会保证传播回当前状态的内部表示。