The f_locals
模块堆栈框架的globals()
!
您可以通过打印来验证这一点is
与比较globals()
在 - 的里面modify
功能:
def modify():
print(inspect.stack()[1][0].f_locals is globals())
inspect.stack()[1][0].f_locals['a'] = 8888
通过此更改,输出为:
$python3 modify.py
10
False
10
20
True
8888
修改返回的字典globals()
does工作(见this问题)。这是明确地 有记录的该模块通过简单的方式实现它们的名称空间dict
:
模块是由导入的import
声明(请参阅导入部分
陈述)。模块对象有一个由
字典对象(这是由func_globals
模块中定义的函数的属性)。
然而字典返回locals() does not必须是本地命名空间:
Note本词典的内容不得修改;更改可能不会影响所使用的局部变量和自由变量的值
口译员。
In 一些版本python2的修改locals()
使用时有效exec
函数内的语句。尝试添加exec ''
在 - 的里面outer
函数并查看输出是否改变(不保证改变!但可能性更大)。
编辑:在 python 2.7.6 上我可以让它工作if堆栈帧使用exec
陈述and代码中没有对局部变量进行赋值。例如与outer
定义为:
def outer():
exec('a = 10')
print(a)
modify()
print(a)
locals()['a'] = 9999
print(a)
我得到输出:
$python2 modify.py
10
False
8888
9999
20
True
8888
但如果我添加a = 10
之后exec
as in:
def outer():
exec('a = 10')
a = 10
print(a)
modify()
print(a)
locals()['a'] = 9999
print(a)
结果是:
$python2 modify.py
10
False
10
10
20
True
8888
我希望这向您展示了分配给当地人的条件确实是可行的few并且绝对不可靠。
AFAIK 在 python3 中返回的字典locals()
is always只是真实名称空间的副本,因此修改它永远不会起作用。但也没有任何保证。
返回的值f_locals
属性只是返回的值locals()
在那时候。
总之:no, 有no修改通用堆栈帧的本地命名空间的可靠方法。您无法修改、删除或添加新的局部变量到通用堆栈帧的命名空间。