gpt4 book ai didi

python - 从导入中使用时在python中传递变量*

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:11 25 4
gpt4 key购买 nike

如何在运行 b.py 时打印“baz”?

a.py

def foo():
global bar
print bar

b.py

from a import *
bar = "baz"
foo()

最佳答案

在如此简单的示例中,大多数情况下真正的答案是使用函数参数(如前所述)。但如果重点是测试 Python 范围规则,那么我想我可以澄清......

如果您从 C/C++ 上下文思考,那么您很容易对 Python 导入的工作方式感到困惑。模块导入的功能不像#include 指令。在 C/C++ 中,编译器将使用 #include 指令作为标记,用于将来自其他源/头文件的源代码插入当前源文件(它是包含源的自己的本地副本)。结果是,当它被编译时,全局变量将被限定为包含所有#included 源的编译单元。您可以使用 #includes 的顺序做一些肮脏的技巧来制作一些非常难以理解的代码。 :-P

Python 导入不提供共享导入模块作用域的本地模块实例。相反,它提供了对在解释器的当前执行中共享的单例模块对象的引用。模块对象在第一次导入时被实例化。随后的导入,无论是在同一模块中还是来自完全不同的模块,都只会获得对同一模块对象的引用。 “全局”在其模块内是全局的。从其他模块,它只能通过对该模块的引用来访问。例如,在 a.py 中,您需要导入 b 才能访问“bar”的值。

在您的示例中,您不应该这样做,因为您将进行周期性导入。如果你真的需要设置模块范围的状态,你可以从 b 模块设置一个全局模块:a.bar = bar(序列依赖 hell )。

不要改变a.py,

def foo():
print bar

但将 b.py 更改为:

import a
a.bar = "baz"
a.foo()

一个封装得更好的例子会让 a.py 提供一个函数来设置它的全局状态,这样 b.py 就可以执行 a.set_module_state( "baz")

关于python - 从导入中使用时在python中传递变量*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2745942/

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