9.23 在局部变量域中执行代码.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档