2012-09-04 61 views
13

在Python,我不是下面的代碼兩行之間的區別是很清楚:「導入X」和「從X導入*」之間的區別?

import X 

from X import * 

難道他們都只是進口一切從模塊X?有什麼不同?

+1

你怎麼知道有區別? – eboix

+1

我認爲它主要是一個命名空間問題...''import X'允許你維護獨立的命名空間......而'從X導入*'將它們放在本地命名空間 –

+0

如果你不知道從X導入*'進口不使用它。如果你知道它輸入什麼,請不要使用它。你只是在污染你的名字空間。 – Matthias

回答

30

import x之後,你可以參考x的東西,比如x.something。在from x import *之後,您可以直接引用x中的內容,就像something一樣。由於第二個表單將名稱直接導入到本地名稱空間,所以如果您從多個模塊導入內容,則會產生衝突的可能性。因此,不鼓勵from x import *

您也可以做from x import something,它只將something導入到本地名稱空間中,而不是x中的所有內容。這樣做更好,因爲如果列出您導入的名稱,則確切知道要導入的內容,避免名稱衝突更容易。

5
import X 

在引用模塊對象的本地名稱空間中創建一個標籤。

from X import * 

創建用於X模塊的每一個成員屬性的標籤,直接在本地名稱空間中。

這兩個操作都將X添加到sys.modules,這是正確的,但對本地名稱空間的影響是不同的。

9

import X:這進口的一切,X.var1X.var2

from X import *:這個進口寄託都爲var1var2等,也就是說,它充斥本地命名空間

看到後兩個調用的區別:

>>> import math 
>>> len(globals()) 
5       #no of variables in namespace 
>>> globals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, '__package__': None} 
>>> 
>>> 
>>> from math import * 
>>> len(globals()) 
47      #no of variables in namespace 
>>> globals() 
{'pow': <built-in function pow>, 'fsum': <built-in function fsum>, 'cosh': <built-in function cosh>, 'ldexp': <built-in function ldexp>, 'hypot': <built-in function hypot>, 'acosh': <built-in function acosh>, 'tan': <built-in function tan>, 'asin': <built-in function asin>, 'isnan': <built-in function isnan>, 'log': <built-in function log>, 'fabs': <built-in function fabs>, 'floor': <built-in function floor>, 'atanh': <built-in function atanh>, 'sqrt': <built-in function sqrt>, '__package__': None, 'frexp': <built-in function frexp>, 'factorial': <built-in function factorial>, 'degrees': <built-in function degrees>, 'pi': 3.141592653589793, 'log10': <built-in function log10>, '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, 'asinh': <built-in function asinh>, 'fmod': <built-in function fmod>, 'atan': <built-in function atan>, '__builtins__': <module '__builtin__' (built-in)>, 'copysign': <built-in function copysign>, 'cos': <built-in function cos>, 'ceil': <built-in function ceil>, 'atan2': <built-in function atan2>, 'isinf': <built-in function isinf>, 'sinh': <built-in function sinh>, '__name__': '__main__', 'trunc': <built-in function trunc>, 'expm1': <built-in function expm1>, 'e': 2.718281828459045, 'tanh': <built-in function tanh>, 'radians': <built-in function radians>, 'sin': <built-in function sin>, 'lgamma': <built-in function lgamma>, 'erf': <built-in function erf>, 'erfc': <built-in function erfc>, 'modf': <built-in function modf>, 'exp': <built-in function exp>, 'acos': <built-in function acos>, 'log1p': <built-in function log1p>, 'gamma': <built-in function gamma>} 
2

有差異,一些簡單,其他需要更多解釋。

import X只是導入整個模塊(讀取:「運行模塊」),並在本地範圍內爲其分配一個名稱。該名稱可以使用別名,像這樣:import X as Y

from X import *導入所有屬性模塊X到本地範圍,在默認情況下。這裏有不同的用法的例子:

# Assume that module `X` contains an `opendb` function 
import X 
X.opendb('Y') 

# VS. 
from X import * 
opendb('Y') 

如果這得到稍微更復雜的是,當一個模塊定義__all__。這將from X import *的語義更改爲意味着「導入所有」中列出的__all__屬性。「這允許模塊編寫者控制哪些功能和對象從模塊中導出。

1

from X import *將模塊X中的所有元素導入當前命名空間。 import X導入X但不「合併」命名空間。例如: -

模塊X:

def foo(): pass 
BAR = 12 

您的代碼:

from X import * 
foo() # calls X.foo 
print BAR # prints 12 

或者:

import X 
X.foo() 
print X.BAR 
1

讓我們用這個作爲我們的模塊定義的例子

def my_func(): 
    return 1 

的進口將拉動一切都變成了當前的命名空間

from X import * 
print my_func() 

正常的貨物將在當前名字空間

import X 
print x.my_func() 

除了與X進口my_func,並將可以創建一個名爲X模塊對象用於只導入該功能。

2

你應該從來沒有使用from X import *除非你真的知道你在做什麼。您可以從模塊X中獲取與來自另一個模塊或甚至您自己的程序的符號相沖突的符號。我對這條規則的唯一例外有時是from math import *

您可以使用表格from X import y從模塊中獲取單個東西。

如果使用import X形式,你不僅使你的模塊明確X.y的使用,但你現在可以使用reload功能,如果您更改模塊,需要重新導入。

相關問題