开发者社区> 问答> 正文

在局部变量域中执行代码

你想在使用范围内执行某个代码片段,并且希望在执行后所有的结果都不可见。

展开
收起
哦哦喔 2020-04-17 16:27:45 899 0
2 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!
    解决方案
    
    为了理解这个问题,先试试一个简单场景。首先,在全局命名空间内执行一个代码片段:
    
    >>> 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异常,就跟在 exec() 语句从没执行过一样。 要是你想在后面的计算中使用到 exec() 执行结果的话就会有问题了。
    
    为了修正这样的错误,你需要在调用 exec() 之前使用 locals() 函数来得到一个局部变量字典。 之后你就能从局部字典中获取修改过后的变量值了。例如:
    
    >>> def test():
    ...     a = 13
    ...     loc = locals()
    ...     exec('b = a + 1')
    ...     b = loc['b']
    ...     print(b)
    ...
    >>> test()
    14
    >>>
    
    
    
    2020-04-17 17:34:56
    赞同 展开评论 打赏
  • 为了理解这个问题,先试试一个简单场景。首先,在全局命名空间内执行一个代码片段:
    
    >>> 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异常,就跟在 exec() 语句从没执行过一样。 要是你想在后面的计算中使用到 exec() 执行结果的话就会有问题了。
    
    为了修正这样的错误,你需要在调用 exec() 之前使用 locals() 函数来得到一个局部变量字典。 之后你就能从局部字典中获取修改过后的变量值了。例如:
    
    >>> def test():
    ...     a = 13
    ...     loc = locals()
    ...     exec('b = a + 1')
    ...     b = loc['b']
    ...     print(b)
    ...
    >>> test()
    14
    >>>
    
    2020-04-17 16:27:53
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
对象的生命期管理 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载