“ exec”函数后从locals()无法访问的变量

时间:2019-06-03 08:06:50

标签: python-3.x

我有一个python文件“ test.py”,其中包含代码:

def LoadTestInformation(self): 
    config = ConfigParser.ConfigParser() 
    print(os.path.join(os.getcwd(),'App.cfg')) 

打开python3并输入下一个代码:

    variable = 10

并获得输出:

    def main():
        with open("test.py") as f:
            exec(f.read())
        print(locals())
        print(variable)
    main()

为什么locals()具有“变量”,但不能执行该变量?

2 个答案:

答案 0 :(得分:0)

好。这是我的解释。如果您将使用dis模块,则会看到以下内容:

 32 LOAD_GLOBAL              3 (print)
 34 LOAD_GLOBAL              4 (variable)
 36 CALL_FUNCTION            1

LOAD_GLOBAL -将全局名为co_names [namei]加载到堆栈中。

但是为什么python不尝试首先在本地名称空间中搜索呢?我认为这是由于python优化。 如果完成:

print(main.__code__.co_varnames)
print(main.__code__.co_names)

可以看到:

('f',)
('open', 'exec', 'read', 'print', 'variable')

通过这种方式,解释器在编译时编译为字节码,发现本地作用域中没有此类变量,并生成了用于搜索全局作用域的代码。但是与此同时,变量本身的值是从本地变量和全局变量中获取的,exec精确地更新了本地变量的作用域,并在其中添加了variable的值

答案 1 :(得分:-2)

这将起作用

overflow: auto

说明

Python在嵌套范围内工作,其中在外部范围内定义的任何变量在内部范围内将自动可用,但反之则不成立。

def f(): with open("temp.py") as f: temp = f.read() exec(temp) print(locals()) print(variable) f() 范围内使用exec时,变量with仅在该范围内可用。它在variable块范围之外的功能f()范围内不可用