如何在python中只导入所需的对象?

如何在python中只导入所需的对象?,python,Python,我正在从另一个模块导入一个模块 第一个模块有 a variable initialized to None a method 在另一个模块中,我使用 from 1stmodule import method 但这是在导入时将变量再次初始化为“无”,如何在不更改变量的情况下仅将方法导入第二个模块?您需要使用全局关键字,例如global your\u var,以使您对其所做的任何更改在全局可用。有关更多详细信息,请参阅 您还需要非常小心如何以及在何处修改此变量,因为如果您迷失方向,您将浪费大量时

我正在从另一个模块导入一个模块

第一个模块有

a variable initialized to None
a method
在另一个模块中,我使用

from 1stmodule import method

但这是在导入时将变量再次初始化为“无”,如何在不更改变量的情况下仅将方法导入第二个模块?

您需要使用全局关键字,例如
global your\u var
,以使您对其所做的任何更改在全局可用。有关更多详细信息,请参阅

您还需要非常小心如何以及在何处修改此变量,因为如果您迷失方向,您将浪费大量时间进行调试,并想知道为什么变量没有返回您期望的值

关于全局变量的危险性一直存在争论,但我倾向于这样的观点——如果你不确定是否使用全局变量,那么你就不应该使用全局变量


实际上,我建议修改您的方法。

导入模块时,Python将执行模块的代码。这就是为什么只需导入脚本就可以执行它。要防止执行模块,请添加:

if "__name__" == __main__:
    # the code that should run if this file
    # is run directly as a script, e.g. from
    # the command line
    main()
此语句告诉Python:Execute
main()
,但前提是没有导入I(模块)。

因此,由于在第一个模块中有全局范围内的变量初始化,因此在导入该模块时执行该变量


正如@Brunodesshuilliers所说:顶级模块语句只在第一次导入时执行(对于给定的进程)

全局
语句与op的问题有什么关系?他试图全局修改
1stmodule
中的变量,因为它不是全局变量,所以无法工作。请参阅以获得更深入的解释。我们看不到他的代码,因此我们不知道他在尝试做什么,全局语句是模块级的noop-它只在函数体中有意义。您是对的,我们不知道他在没有看到代码的情况下正在尝试做什么。然而,当你考虑到他正在修改一个全局变量并试图从其他模块访问它时,想象他在寻找一个全局变量并不难。我想不出还有什么其他原因,如果你不打算修改模块级变量,为什么你会将其设置为
None
。只要我们没有看到代码,一切都只是猜测——特别是他会“试图从其他模块访问它”(事实上,他只是想导入与你的假设相反的函数FWIW)。但无论如何,在OP给出更多细节之前,没有可能的“好答案”IMHO。你说的“再次初始化变量为无”是什么意思?在同一过程中第二次导入同一模块不会重新初始化该模块。是的,这里的答案是正确的。我不确定我是否同意这是一个初始化问题。正如@bruno_desthilliers指出的,该模块只导入一次。根据我从OP收集到的信息,他很难理解模块级变量的原因可能他最初设置为
None
,并且(我假设)将
1stmodule
中的某个地方的值更改为None,但当他尝试直接访问它时,该值再次变为None。这不是由导入时模块“重新初始化”引起的。抱歉,alice,但这不是“正确答案”.Top level module语句仅在第一次导入时执行(对于给定的进程)。@Brunodesshuilliers好的,我现在正在编辑答案。但执行该Top level module语句是变量初始化为None的原因。@RaydelMiranda:yes,“执行顶层模块语句是变量初始化为None的原因”,但这只发生在第一次导入时。除非OP希望一个进程更新变量,另一个进程能够访问更新后的值(到目前为止,这是我理解他的问题的唯一方法,但这确实是一个胡乱猜测),在第一次导入时执行顶级语句这一事实无关紧要——无论执行模型如何,大多数语言都会得到相同的结果。