为什么在Python中修改父框架仅适用于模块框架?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么在Python中修改父框架仅适用于模块框架?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2028字,纯文字阅读大概需要3分钟。
内容图文
![为什么在Python中修改父框架仅适用于模块框架?](/upload/InfoBanner/zyjiaocheng/818/ce612dc854b74cfa813dc962cfff6f1a.jpg)
我正在玩inspect.stack().我尝试修改父框架的局部变量,它似乎仅在父框架是模块级别时才起作用.以下代码显示了这一点(Python 2.7):
import inspect
def outer():
a = 10
print a
modify()
print a
def modify():
inspect.stack()[1][0].f_locals['a'] = 8888
outer()
a = 20
print a
modify()
print a
当父框架是一个函数时,为什么它不起作用?我可以让它运作吗?
解决方法:
模块堆栈框架的f_locals是它的globals()!
您可以通过在modify函数中打印与globals()的比较来验证这一点:
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()返回的字典确实有效(参见this问题).显然是documented,模块用一个简单的dict实现它们的命名空间:
Modules are imported by the
import
statement (see section The import
statement). A module object has a namespace implemented by a
dictionary object (this is the dictionary referenced by the
func_globals
attribute of functions defined in the module).
但是,locals()返回的字典不必是本地名称空间:
Note The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by
the interpreter.
在某些版本的python2中,修改locals()在函数内部使用exec语句时起作用.尝试在外部函数中添加exec”,看看输出是否发生变化(不能保证更改!但更有可能).
编辑:在python 2.7.6上,如果堆栈帧使用exec语句并且代码中没有对局部变量的赋值,我可以使它工作.例如,外部定义为:
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
但是如果我在exec之后添加一个= 10,如:
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
我希望这能告诉你,分配给当地人工作的条件很少,绝对不可靠.
在python3中的AFAIK,locals()返回的字典总是只是真实命名空间的副本,因此修改它永远不会起作用.但是也不能保证.
f_locals属性返回的值只是locals()在该点返回的值.
总结:不,没有可靠的方法来修改通用堆栈帧的本地命名空间.您不能修改,删除或添加新的局部变量到通用堆栈框架的命名空间.
内容总结
以上是互联网集市为您收集整理的为什么在Python中修改父框架仅适用于模块框架?全部内容,希望文章能够帮你解决为什么在Python中修改父框架仅适用于模块框架?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。