Python:如何导入所有变量?

51 投票
4 回答
117829 浏览
提问于 2025-04-15 12:42

我刚开始学Python和编程(最多也就几周)。

关于Python和使用模块,我发现可以用 from a import * 的方式来导入函数。

这样我就不需要输入

a.sayHi()
a.sayBye()

而是可以直接说

sayHi()
sayBye()

这样做让我觉得简单多了。现在,假设我有一堆 变量 想在不同的模块中使用,而这些变量都定义在一个Python模块里。我想用类似上面提到的方法,或者其他简单的方法,来导入这些变量。我不想用 import a 然后每次都要在变量前面加上 a.

以下的情况是我理想中的样子:

a.py

name = "Michael"
age = 15

b.py

some_function

if name == "Michael":
    if age == 15:
        print("Simple!") 

输出:

Simple!

4 个回答

14

就像其他人说的,

from module import *

这也会导入模块中的变量。

不过,你需要明白,你并不是在导入变量,而是导入了指向对象的引用。也就是说,在导入模块中把导入的名字赋值为其他东西不会影响到其他模块。

举个例子,假设你有一个模块叫做 module.py,里面有以下代码:

a= 1
b= 2

然后你还有两个其他模块,mod1.pymod2.py,它们都做了以下事情:

from module import *

在每个模块中,创建了两个名字,ab,分别指向对象 12

现在,如果在 mod1.py 的某个地方,你把全局名字 a 赋值为其他东西:

a= 3

那么在 module.py 中的名字 a 和在 mod2.py 中的名字 a 仍然会指向对象 1

所以,如果你想要只读的全局变量,使用 from module import * 是可以的,但如果你想要可读写的全局变量,那就最好使用 import module,然后通过模块前缀来获取值(module.a)或者设置值(module.a= …)。

39

为了让大家更明白,很多代码检查工具会对 from module import * 这种写法发出警告,因为它容易导致命名冲突,之后可能会让你很头疼。

目前还没有人提到,作为一种替代方法,你可以使用

from a import name, age

这种形式,然后可以直接使用 nameage(不需要加 a. 前缀)。使用 from [module] import [identifiers] 这种写法更能适应未来的变化,因为你可以很清楚地看到哪个导入会覆盖另一个。

另外要注意的是,在Python中,“变量”和“函数”在如何被引用上没有区别——每个像 namesayBye 这样的标识符都是指向某种对象的。比如,标识符 name 指向一个字符串对象,sayBye 指向一个函数对象,而 age 指向一个整数对象。当你告诉Python:

from a import name, age

你实际上是在说:“在模块 a 中,取 nameage 指向的那些对象,并在当前作用域中用相同的标识符指向它们。”

同样,如果你想用不同的标识符来引用它们,你可以使用

from a import sayBye as bidFarewell

这种形式。指向的仍然是同一个函数对象,只不过在当前作用域中,指向它的标识符是 bidFarewell,而在模块 a 中,指向它的标识符是 sayBye

83

你自己已经给出了答案:from a import * 这样写就可以了。在Python中,函数和变量在这方面是没有区别的。

>>> from a import *
>>> if name == "Michael" and age == 15:
...     print('Simple!')
...
Simple!

撰写回答