在python中导入模块的这两种方式之间有什么区别(如果有的话)?

时间:2014-12-11 02:30:54

标签: python python-2.7

在阅读一些python代码时,我遇到了两种导入用户定义模块的方法。

第一个;

import config

第二个;

from config import *

两者有什么区别?如果两行代码都存在会发生什么?有副作用吗?

2 个答案:

答案 0 :(得分:4)

假设有一个名为unicorn的模块,其中包含全局内容stackoverflow

  • 如果您执行import unicorn,则可以unicorn.stackunicorn.overunicorn.flow访问这些内容。
  • 如果您执行import unicorn as U,则可以U.stackU.overU.flow访问这些内容。
  • 如果您执行from unicorn import stackstack中的unicorn对象将被复制到全局变量stack中。
  • 如果您执行from unicorn import *stack和模块中的所有全局对象(名称以下划线开头的私有对象除外)将复制到全局命名空间中。这可能没问题,但稍后对unicorn模块的更新可能会添加导致程序意外运行的内容。例如,如果您有名为userserver的变量,则unicorn的未来更新会添加superuserserverfault可能会导致行为不端。
  • 如果您执行from unicorn import stack, over, flow,则只会复制您指定的内容,即使将更多内容添加到unicorn,您的程序仍会继续有效。
  • 如果您执行from unicorn import stack as H,则会从stack模块获得unicorn,但在您的计划的全局命名空间中,它会被称为H。如果您经常使用特定的功能或变量,这可以帮助您保持80行以下的字符。

答案 1 :(得分:-1)

代码

import config

只需导入名为config的模块,如果你想使用它的方法,你需要使用像myname = config.getName()这样的东西。

代码

from config import *

会将config导出的所有内容导入当前命名空间。现在,如果要在config中使用getName方法,则代码类似于myname = getName()

我们总是使用第一种导入方式,因为您可以使用由多个模块导出的具有相同名称的不同方法。例如,我们可以使用下面的两个getName方法:

import config
import mydata

print config.getName()#print Jim
print mydata.getName()#print Tom

当您以第二种方式执行此操作时,最后一个导入代码将导入getName方法替换您通过第一个导入代码导入的方法:

from config import *
from mydata import *

print getName()#print Tom

所以你可以看到,当前的命名空间被第二种方式污染了。