Python:如何导入所有变量?
我刚开始学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 个回答
就像其他人说的,
from module import *
这也会导入模块中的变量。
不过,你需要明白,你并不是在导入变量,而是导入了指向对象的引用。也就是说,在导入模块中把导入的名字赋值为其他东西不会影响到其他模块。
举个例子,假设你有一个模块叫做 module.py
,里面有以下代码:
a= 1
b= 2
然后你还有两个其他模块,mod1.py
和 mod2.py
,它们都做了以下事情:
from module import *
在每个模块中,创建了两个名字,a
和 b
,分别指向对象 1
和 2
。
现在,如果在 mod1.py
的某个地方,你把全局名字 a
赋值为其他东西:
a= 3
那么在 module.py
中的名字 a
和在 mod2.py
中的名字 a
仍然会指向对象 1
。
所以,如果你想要只读的全局变量,使用 from module import *
是可以的,但如果你想要可读写的全局变量,那就最好使用 import module
,然后通过模块前缀来获取值(module.a
)或者设置值(module.a= …
)。
为了让大家更明白,很多代码检查工具会对 from module import *
这种写法发出警告,因为它容易导致命名冲突,之后可能会让你很头疼。
目前还没有人提到,作为一种替代方法,你可以使用
from a import name, age
这种形式,然后可以直接使用 name
和 age
(不需要加 a.
前缀)。使用 from [module] import [identifiers]
这种写法更能适应未来的变化,因为你可以很清楚地看到哪个导入会覆盖另一个。
另外要注意的是,在Python中,“变量”和“函数”在如何被引用上没有区别——每个像 name
或 sayBye
这样的标识符都是指向某种对象的。比如,标识符 name
指向一个字符串对象,sayBye
指向一个函数对象,而 age
指向一个整数对象。当你告诉Python:
from a import name, age
你实际上是在说:“在模块 a
中,取 name
和 age
指向的那些对象,并在当前作用域中用相同的标识符指向它们。”
同样,如果你想用不同的标识符来引用它们,你可以使用
from a import sayBye as bidFarewell
这种形式。指向的仍然是同一个函数对象,只不过在当前作用域中,指向它的标识符是 bidFarewell
,而在模块 a
中,指向它的标识符是 sayBye
。
你自己已经给出了答案:from a import *
这样写就可以了。在Python中,函数和变量在这方面是没有区别的。
>>> from a import *
>>> if name == "Michael" and age == 15:
... print('Simple!')
...
Simple!