gpt4 book ai didi

python-3.x - 在 "exec"函数之后无法从 locals() 访问变量

转载 作者:行者123 更新时间:2023-12-05 08:07:12 24 4
gpt4 key购买 nike

我有一个 python 文件“test.py”,里面有代码:

    variable = 10

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

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

并得到输出:

{'f': <_io.BufferedReader name='test.py'>, 'variable': 10}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in main
NameError: name 'variable' is not defined

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

最佳答案

好的。这是我的解释。如果您将使用 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 添加值

关于python-3.x - 在 "exec"函数之后无法从 locals() 访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56423357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com