我是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!
答案 0 :(得分:60)
您自己提供了解决方案:from a import *
可以正常使用。在这方面,Python没有区分函数和变量。
>>> from a import *
>>> if name == "Michael" and age == 15:
... print('Simple!')
...
Simple!
答案 1 :(得分:33)
只是对于某些上下文,大多数短号都会标记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
你说的是“在模块name
中抓取age
和a
指向的对象,并在当前范围内使用相同的标识符指向它们。”
同样,如果要在导入时使用不同的标识符指向它们,可以使用
from a import sayBye as bidFarewell
形式。指向相同的函数对象,除了在当前作用域中指向它的标识符为bidFarewell
,而在模块a
中指向它的标识符为sayBye
。
答案 2 :(得分:13)
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
a
中的名称module.py
和a
中的mod2.py
名称仍将指向对象1
。
如果你想要只读全局变量,那么from module import *
将起作用,但如果你想要读写全局变量,它将不起作用。如果是后者,最好只导入import module
然后获取值(module.a
)或设置值(module.a= …
)以模块为前缀。
答案 3 :(得分:8)
你没有直接说出来,但我假设你在操纵这些全局变量方面遇到了麻烦。
如果从函数内部操作全局变量,则必须将它们声明为全局变量
a = 10
def x():
global a
a = 15
print a
x()
print a
如果你不这样做,那么a = 15
将只创建一个局部变量并将其分配15,而全局a保持10