Python:如何导入所有变量?

Python:如何导入所有变量?,python,variables,import,module,Python,Variables,Import,Module,一般来说,我对Python和编程都是新手(最多几周) 关于Python和使用模块,我意识到可以使用import*导入函数 因此,与其打字 a.sayHi() a.sayBye() 我可以说 sayHi() sayBye() 我发现这大大简化了事情。现在,假设我有一组变量,我想跨模块使用,并且我在一个python模块中定义了它们。如何使用上述类似方法或同样简单的方法导入这些变量。我不想使用导入一个,然后被要求在所有变量前面加a. 理想情况下,以下情况将: a、 派克 b、 派克 输出: Sim

一般来说,我对Python和编程都是新手(最多几周)

关于Python和使用模块,我意识到可以使用import*导入函数

因此,与其打字

a.sayHi()
a.sayBye()
我可以说

sayHi()
sayBye()
我发现这大大简化了事情。现在,假设我有一组变量,我想跨模块使用,并且我在一个python模块中定义了它们。如何使用上述类似方法或同样简单的方法导入这些变量。我不想使用
导入一个
,然后被要求在所有变量前面加
a.

理想情况下,以下情况将:

a、 派克

b、 派克

输出:

Simple!

您自己给出了解决方案:
从导入*
就可以了。Python在这方面不区分函数和变量

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

你没有直接说,但我假设你在操作这些全局变量时遇到了麻烦

如果从函数内部操作全局变量,则必须将其声明为全局变量

a = 10
def x():
   global a
   a = 15

print a
x()
print a

如果您不这样做,那么
a=15
将只创建一个局部变量并将其赋值15,而全局a仅在某些上下文中保持10

,大多数过梁将在模块导入中标记
*
,并发出警告,因为它很容易发生名称空间冲突,这将导致后顾之忧

还没有人注意到,作为替代方案,您可以使用

from a import name, age
from a import sayBye as bidFarewell
填写表格,然后直接使用
name
age
(不带
a.
前缀)。[module]import[identifiers]
表单中的
更适合未来,因为您可以很容易地看到一个导入何时会覆盖另一个导入

还要注意的是,“变量”在如何寻址方面与Python中的函数没有什么不同——像
name
saybay
这样的每个标识符都指向某种对象。标识符
name
指向字符串对象,
saybay
指向函数对象,
age
指向整数对象。当您告诉Python:

from a import name, age
您的意思是“在模块
a
中取
name
age
指向的对象,并在当前范围内用相同的标识符指向它们”

类似地,如果希望在导入时使用不同的标识符指向它们,可以使用

from a import name, age
from a import sayBye as bidFarewell
形式。相同的函数对象被指向,除了在当前范围中指向它的标识符是
bidbaye
,而在模块
a
中,指向它的标识符是
saybeye

,正如其他人所说

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


因此,如果您想要只读全局变量,模块导入中的
*
将起作用,但如果您想要读写全局变量,它将不起作用。如果是后者,最好只导入
import模块
,然后获取值(
module.a
)或设置以模块为前缀的值(
module.a=…
)。

从长远来看,“大大简化事情”将是一个非常糟糕的主意。当你有一个或两个以上的模块时,这个“来自模块导入*”就不能很好地工作了。是的,我想。不管怎样,在必要的时候,这是一个有用的技巧。它主要用于边缘情况,例如,当您有一个“基本模块”和几个可能被导入的平台特定版本,这些版本想要获取基本模块的内容并添加到其中。操作系统模块就是这样工作的,例如,根据平台的不同执行“从nt导入*”或“从posix导入*”。@十一月先生:实际上,这不是一个有用的技巧。在Python简介的第1天和第2天,当您在教室里学习时,它非常方便。到了第3天,它不再被接受,因为它造成的问题比它解决的问题还多。我现在看到“从模块导入*”在大多数程序情况下可能是一个问题,但我发现它有一个特别方便的用途,不会引起问题。再说一次,我是一个Python新手,所以它可能会完全过时。谢谢。我从来没有听说过像以前一样…导入…如果答案对你有帮助,请随意投票!(至少,这是工具提示所说的。:-)这很有帮助,但我还没有15个声誉,我需要那么多的选票;\u;要是我能在这里有用就好了……啊,我忘了。别担心--我相信你会找到更多好问题要问/回答。:-)正如@cdleary所说,导入
*
不是一个很好的主意,但是如果您想从库中获取所有模块,另一种选择是导入库本身(例如
导入一个
),然后使用类似(
a.get_whatever()
)什么??很多!如果函数想要更改
名称
的值,那么必须在函数内部声明
全局名称
如何?我相信这不会导入受保护的变量,例如
\u this\u one
。这会给我一个警告:“from module import*”used无法检测未定义的名称。