- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
9.23 在局部变量域中执行代码
9.23 在局部变量域中执⾏代码
问题
你想在使⽤范围内执⾏某个代码⽚段,并且希望在执⾏后所有的结果都不可见
解决⽅案
为了理解这个问题,先试试⼀个简单场景 ⾸先,在全局命名空间内执⾏⼀个代码⽚
段:
a = 13
exec(b = a + 1)
print(b)
14
然后,再在⼀个函数中执⾏同样的代码:
def test():
... a = 13
... exec(b = a + 1)
... print(b)
...
test()
Traceback (most recent call last):
File stdin , line 1, in module
File stdin , line 4, in test
NameError: global name b is not defined
可以看出,最后抛出了⼀个NameError异常,就跟在 span class= pre
style= box-sizing: border-box; exec()/span 语句从没执⾏过⼀样
要是你想在后⾯的计算中使⽤到 span class= pre style= box-sizing:
border-box; exec()/span 执⾏结果的话就会有问题了
为了修正这样的错误,你需要在调⽤ span class= pre style= box-
sizing: border-box; exec()/span 之前使⽤ span class= pre
style= box-sizing: border-box; locals()/span 函数来得到⼀个局
部变量字典 之后你就能从局部字典中获取修改过后的变量值了 例如:
def test():
... a = 13
... loc = locals()
... exec(b = a + 1)
... b = loc[b]
... print(b)
...
test()
14
讨论
实际上对于 span class= pre style= box-sizing: border-
box; exec()/span 的正确使⽤是⽐较难的 ⼤多数情况下当你要考虑使
⽤ span class= pre style= box-sizing: border-box; exec()
/span 的时候, 还有另外更好的解决⽅案 (⽐如装饰器、闭包、元类等等)
然⽽,如果你仍然要使⽤ span class= pre style= box-sizing:
border-box; exec()/span ,本节列出了⼀些如何正确使⽤它的⽅法 默认
情况下,span class= pre style= box-sizing: border-
box; exec()/span会在调⽤者局部和全局范围内执⾏代码 然⽽,在函数⾥
⾯, 传递给 span class= pre style= box-sizing: border-
box; exec()/span 的局部范围是拷贝实际局部变量组成的⼀个字典 因此,
如果 span class= pre style= box-sizing: border-box; exec()
/span 如果执⾏了修改操作,这种修改后的结果对实际局部变量值是没有影响
的 下⾯是另外⼀个演⽰它的例⼦:
def test1():
... x = 0
... exec(x += 1)
... print(x)
...
test1()
0
上⾯代码⾥,当你调⽤ span class= pre style= box-sizing: border-
box; locals()/span 获取局部变量时,你获得的是传递给 span
class= pre style= box-sizing: border-box; exec()/span 的局
部变量的⼀个拷贝 通过在代码执⾏后审查这个字典的值,那就能获取修改后的值
了 下⾯是⼀个演⽰例⼦:
def test2():
... x = 0
... loc = locals()
... print(before:, loc)
... exec(x += 1)
... print(after:, loc)
... prin
原创力文档


文档评论(0)