接續 匯入模組,使用import匯入模組,會以被匯入的模組名稱在當前模組命名一個同名的名稱,被匯入模組中的變數,其實是以被匯入模組為名稱空間。例如,若有個some.py:
name = 'Justin'
若你匯入some模組,要存取some模組中的name變數,則必須使用some.name。事實上,你可以使用del刪除與被匯入模組同名的變數:
import some
print(some.name) # Justin
del some
print(some.name) # NameError: name 'some' is not defined
上例中,於del some後,由於目前模組中已沒有some變數,因而發生錯誤。你可以在del與被匯入模組同名的變數,之後再度使用import設回該變數。例如:
import some
print(some.name) # Justin
del some
import some
print(some.name) # Justin
再次匯入模組,可以設回與被匯入模組的同名變數,但不會再度執行被匯入模組,import模組時只會執行模組一次,再次import是不會再度執行模組的。
如果想要知道現在到底匯入了多少模組,則可以使用sys.modules得知,這是個字典物件。例如:
>>> import sys
>>> sys.modules.keys()
dict_keys(['heapq', 'sre_compile', '_collections', 'locale', '_multibytecodec',
'functools', 'encodings', 'site', 'operator', 'io', '__main__', 'copyreg', '_hea
pq', '_weakref', 'abc', 'builtins', 'errno', 'itertools', 'sre_constants', 're',
'encodings.latin_1', 'collections', 'ntpath', '_sre', 'nt', 'genericpath', 'sta
t', 'zipimport', '_codecs', '_bisect', 'encodings.utf_8', 'sys', 'codecs', 'os.p
ath', '_functools', '_locale', 'keyword', 'bisect', '_codecs_tw', 'signal', 'wea
kref', '_io', '_weakrefset', 'encodings.cp950', 'encodings.aliases', 'sre_parse'
, 'os', '_abcoll'])
>>>
>>> sys.modules.keys()
dict_keys(['heapq', 'sre_compile', '_collections', 'locale', '_multibytecodec',
'functools', 'encodings', 'site', 'operator', 'io', '__main__', 'copyreg', '_hea
pq', '_weakref', 'abc', 'builtins', 'errno', 'itertools', 'sre_constants', 're',
'encodings.latin_1', 'collections', 'ntpath', '_sre', 'nt', 'genericpath', 'sta
t', 'zipimport', '_codecs', '_bisect', 'encodings.utf_8', 'sys', 'codecs', 'os.p
ath', '_functools', '_locale', 'keyword', 'bisect', '_codecs_tw', 'signal', 'wea
kref', '_io', '_weakrefset', 'encodings.cp950', 'encodings.aliases', 'sre_parse'
, 'os', '_abcoll'])
>>>
如果你使用del刪除某個與被匯入模組同名的變數,並不會影響sys.modules。例如:
import sys
import some
print(some.name) # Justin
del some
print(sys.modules['some'].name) # Justin
print(some.name) # NameError: name 'some' is not defined
如果你想要改變被匯入模組在當前模組中的變數名稱,則可以使用import as。例如:
import some as other
print(other.name) # Justin
import as改變的是被匯入模組在當前模組的名稱,而不是sys.modules中的名稱,以上例來說,sys.modules中的名稱仍然是some。上例比較像是:
import some
other = some
del some
print(other.name)
other = some
del some
print(other.name)
可以使用from import語句建立與被匯入模組中相同的變數名稱。例如:
import some
from some import name
print(name) # Justin
print(some.name) # Justin
name = 'caterpillar'
print(name) # caterpillar
print(some.name) # Justin
上例比較像是:
import some
name = some.name
print(name)
print(some.name)
name = 'caterpillar'
print(name)
print(some.name)
name = some.name
print(name)
print(some.name)
name = 'caterpillar'
print(name)
print(some.name)
但如果是可變動物件,例如:
- other.py
list = [1, 2, 3]
print(list)
則會有以下的結果:
>>> import other
[1, 2, 3]
>>> from other import list
>>> list
[1, 2, 3]
>>> list[0] = 100
>>> list
[100, 2, 3]
>>> other.list
[100, 2, 3]
>>>
[1, 2, 3]
>>> from other import list
>>> list
[1, 2, 3]
>>> list[0] = 100
>>> list
[100, 2, 3]
>>> other.list
[100, 2, 3]
>>>
Python是個不斷演進的語言,有些新語法或功能會不相容於舊版本Python,甚至破壞舊版本Python原本的功能,如果你想要體驗一下將來版本可能有的新語法或功能,則可以透過__future__模組。例如在Python 2.6中,print是個陳述句,而在Python 3中,print是個函式,若要在Python 2.6中使用Python 3中的print函式,則可以:
from __future__ import print_function