栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在Python中修改父框架仅适用于模块框架?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在Python中修改父框架仅适用于模块框架?

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 10False1020True8888

修改返回的字典

globals()
确实
有效(请参阅此问题)。它 明确地
记载该模块实现了自己的一个简单的命名空间
dict


模块通过该

import
语句导入(请参见import语句一节)。
模块对象具有由字典对象(这是由
func_globals
模块中定义的函数的属性引用的字典)实现的名称空间 。

但是返回的字典

locals()

没有 必须是本地的命名空间:

注意 此字典的内容不应修改;更改可能不会影响解释器使用的局部变量和自由变量的值。

在python2的 某些版本

locals()
,使用
exec
函数内的语句进行修改是可行的。尝试
exec''
outer
函数内部添加,看看输出是否发生了变化(不保证会发生变化!但是更有可能)。

编辑:在python 2.7.6上, 如果 堆栈框架使用该

exec
语句 并且
代码中没有分配给局部变量,则可以使其工作。例如,
outer
定义为:

def outer():    exec('a = 10')    print(a)    modify()    print(a)    locals()['a'] = 9999    print(a)

我得到的输出:

$python2 modify.py 10False8888999920True8888

但是,如果我在

a = 10
后面加上
exec

def outer():    exec('a = 10')    a = 10    print(a)    modify()    print(a)    locals()['a'] = 9999    print(a)

结果是:

$python2 modify.py 10False101020True8888

我希望这向您显示,分配给本地人的工作条件确实 很少, 而且绝对不可靠。

据我所知在python3返回的字典

locals()
永远 只是一个真正的命名空间的副本,因此修改它永远不会奏效。但是,也不保证。

f_locals
属性返回的值
locals()
就是该点返回的值。

总结: 没有没有 可靠的方法来修改通用堆栈框架的本地名称空间。您不能修改,删除或向通用堆栈框架的名称空间添加新的局部变量。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659779.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号