【问题标题】:Python: What's the difference between "import X" and "from X import *"? [duplicate]Python:“import X”和“from X import *”有什么区别? [复制]
【发布时间】:2017-09-18 03:26:24
【问题描述】:

我曾经认为两者都是平等的,直到我尝试了这个:

$python
Python 2.7.13 (default, Dec 17 2016, 23:03:43)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter
>>> root=Tk()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Tk' is not defined
>>> from Tkinter import *
>>> root=Tk()

那么这两种从模块中导入所有内容的导入的核心区别是什么?

谢谢。

【问题讨论】:

  • 虽然在 Tkinter 示例代码中经常使用“星号”导入,但这不是一个好习惯。它将所有这些 Tkinter 名称转储到您的名称空间中(Python 2 中的 175 个名称,Python 3 中的 135 个名称)。这会造成不必要的混乱,以及名称冲突的可能性,尤其是在您星型导入另一个模块时。它还使代码更难阅读,因为您必须记住哪些名称是 Tkinter 名称,而不是能够明确地看到它。首选做法是先执行import Tkinter as tk,然后执行root = tk.Tk(); button = tk.Button(root, ...) 之类的操作。
  • 请注意,所有形式的import总是 导入(并执行)整个模块,不同之处在于它们在导入模块中可用的名称。

标签: python tkinter import


【解决方案1】:

当您导入 x 时,它会将名称 x 绑定到 x 对象,它不会让您直接访问作为您的模块的任何对象,如果您想访问任何需要这样指定的对象

x.myfunction()

另一方面,当您使用 from x import * 导入时,它会将所有功能带入您的模块中,因此您可以直接访问它而不是 x.myfunction()

myfunction ()

例如,假设我们有模块 example.py

def myfunction ():
    print "foo"

现在我们有了使用这个模块的主脚本 ma​​in.py

如果你使用简单的导入,那么你需要像这样调用 myfunction()

import example

example.myfucntion()

如果使用from,则不需要使用模块名来引用函数,可以这样直接调用

from example import myfunction

myfunction()

【讨论】:

  • 您听起来好像在普通用户脚本中使用星号导入是一件好事。它是不是。星号导入对于交互式 shell 中的快速实验很方便,但它们应该在普通脚本中使用。星形导入有一个合法的用途:它有助于统一一个包中多个模块的名称,使它们的行为就像它们都定义在一个模块中一样,但用户代码这样做很少是一个好主意,那就是包编写者的工作。
  • How to Answer 中所述,请避免回答不清楚、宽泛、SW 推荐、错字、基于意见、不可复制或重复的问题。回答不恰当的问题会使网站更难导航并鼓励进一步提出此类问题,从而损害网站,这可能会赶走其他自愿提供时间和专业知识的用户。
猜你喜欢
  • 2020-07-23
  • 2019-06-07
  • 2011-07-04
  • 2013-05-20
  • 2015-08-24
  • 2019-07-07
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多