2017-04-21 98 views
-2

我用認爲兩者相等,直到我試圖這樣的:Python:「import X」和「from X import *」有什麼區別?

$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() 

那麼什麼是這2種進口的,從一個模塊中導入所有的核心區別?

謝謝。

+2

雖然「明星」導入經常用在Tkinter示例代碼中,但這並不是一種好的做法。它將所有這些Tkinter名稱轉儲到您的名稱空間(Python 2中的175個名稱,Python 3中的135個名稱)。這會造成不必要的混亂,以及名稱衝突的可能性,尤其是如果您導入另一個模塊。它還使代碼更難閱讀,因爲您必須記住哪些名稱是Tkinter名稱,而不是能夠明確地看到它。首選的做法是'將Tkinter導入爲tk',然後執行'root = tk.Tk();按鈕= tk.Button(root,...)'。 –

+0

請注意,所有形式的'import' _always_導入(並執行)整個模塊,不同之處在於它們在導入模塊中提供哪些名稱。 –

回答

1

當您導入X,它結合了名稱x到x對象,它不會給你那是你的模塊,如果你想訪問你需要指定這樣的

任何對象的任何對象直接訪問
x.myfunction() 

在當你輸入從X導入*使用的另一面,它把所有的功能集成到你的模塊,這樣反而x.myfunction()例如,您可以直接訪問它

myfunction()

讓我們假設我們有模塊example.py

def myfunction(): 
    print "foo" 

現在我們的主要腳本main.py,它利用這個模塊。

如果你使用簡單的導入,那麼你需要的,如果你用它來調用MyFunction的()這樣的

import example 

example.myfucntion() 

,你不需要使用模塊名稱來指代功能,可以直接調用這樣

from example import myfunction 

myfunction() 
+1

你讓它聽起來像在普通的用戶腳本中使用星形導入是一件好事。不是這樣_。星型導入可以方便地在交互式shell中進行快速實驗,但是它們不應該用於普通腳本。明星導入有一個合理的用途:它有助於統一包中多個模塊的名稱,以使它們的行爲好像它們都在一個模塊中定義,但用戶代碼很少這樣做是一個好主意,那就是包作家的工作。 –

+0

正如[如何回答](http://stackoverflow.com/questions/how-to-answer)中所述,請避免回答不清楚,廣泛的SW記錄,錯字,基於意見的,不可重複的或重複的問題。回答不適當的問題會使網站變得更難以瀏覽和鼓勵更多這樣的問題,從而損害其他用戶的志願者時間和專業知識。 –

相關問題