回答
在import x
之後,你可以參考x的東西,比如x.something
。在from x import *
之後,您可以直接引用x中的內容,就像something
一樣。由於第二個表單將名稱直接導入到本地名稱空間,所以如果您從多個模塊導入內容,則會產生衝突的可能性。因此,不鼓勵from x import *
。
您也可以做from x import something
,它只將something
導入到本地名稱空間中,而不是x中的所有內容。這樣做更好,因爲如果列出您導入的名稱,則確切知道要導入的內容,避免名稱衝突更容易。
import X
在引用模塊對象的本地名稱空間中創建一個標籤。
from X import *
創建用於X
模塊的每一個成員屬性的標籤,直接在本地名稱空間中。
這兩個操作都將X
添加到sys.modules
,這是正確的,但對本地名稱空間的影響是不同的。
import X
:這進口的一切,X.var1
,X.var2
等
from X import *
:這個進口寄託都爲var1
,var2
等,也就是說,它充斥本地命名空間
看到後兩個調用的區別:
>>> 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>}
有差異,一些簡單,其他需要更多解釋。
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__
屬性。「這允許模塊編寫者控制哪些功能和對象從模塊中導出。
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
讓我們用這個作爲我們的模塊定義的例子
def my_func():
return 1
的進口將拉動一切都變成了當前的命名空間
from X import *
print my_func()
正常的貨物將在當前名字空間
import X
print x.my_func()
除了與X進口my_func,並將可以創建一個名爲X模塊對象用於只導入該功能。
你應該從來沒有使用from X import *
除非你真的知道你在做什麼。您可以從模塊X中獲取與來自另一個模塊或甚至您自己的程序的符號相沖突的符號。我對這條規則的唯一例外有時是from math import *
。
您可以使用表格from X import y
從模塊中獲取單個東西。
如果使用import X
形式,你不僅使你的模塊明確X.y
的使用,但你現在可以使用reload
功能,如果您更改模塊,需要重新導入。
- 1. Python的「導入X」和「從模塊導入X」之間的區別?
- 2. int * x []和int(* x)[]之間的區別?
- 3. null == x和x == null之間的區別?
- 4. Java中的類導入和包導入之間的區別?
- 5. TypeScript - 導入...和導入{...}(帶花括號)之間的區別
- 6. 通過導入和導入+ ReactRender.DOM呈現之間的區別 - React
- 7. Django - 導入django.conf.settings和導入設置之間的區別
- 8. IsNull(x)和x =「」之間有區別嗎?
- 9. TOP X和Row_Number之間的區別()
- 10. x:Key和x之間的區別:名稱
- 11. X.509和pem之間的區別
- 12. UNHEX和X之間的區別(MySQL)
- 13. $('x> y'),$('y','x')和$('x y')之間有什麼區別?
- 14. 完整軟件包導入*和指定的類導入java之間的區別?
- 15. 從'文件'導入*爲x和{y,z}
- 16. 當我<x和範圍(x)中的i之間的區別?
- 17. 導入的和定義的類之間的python區別
- 18. 傳遞(int x)和(const int x)之間的區別
- 19. iPhone SDK 3.x和4.x之間的區別
- 20. int(x)和mediumint(x)之間的區別 - MySQL
- 21. x和get(「x」)之間的奇異區別?
- 22. OpenGL 3.x和4.X之間的區別?
- 23. Rails 1.X和2.X之間的主要區別是什麼
- 24. Emacs客戶端:C-x k和C-x之間的區別#
- 25. android 1.x和2.x之間的主要區別
- 26. Python中F(x)和F x之間的區別
- 27. C中「* x = 1」和「x = 1」之間的區別是什麼?
- 28. * x = i和x =&i之間的區別是什麼
- 29. Angular 1.X和2.X之間的區別是什麼
- 30. .at(vect.size())= x之間的區別;和vect.push_back(x);
你怎麼知道有區別? – eboix
我認爲它主要是一個命名空間問題...''import X'允許你維護獨立的命名空間......而'從X導入*'將它們放在本地命名空間 –
如果你不知道從X導入*'進口不使用它。如果你知道它輸入什麼,請不要使用它。你只是在污染你的名字空間。 – Matthias