我有一个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()具有“变量”,但不能执行该变量?
答案 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()
范围内不可用