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