引入模块
,使用import引入模块,會以被匯入的模組名稱在當前模組命名一個同名的名稱,被匯入模組中的变量,其實是以被引入的模块為名稱空間。例如,若有個some.py:
若你匯入some模組,要存取some模組中的name變數,則必須使用some.name。事實上,你可以使用del刪除與被匯入模組同名的變數:
上例中,於del some後,由於目前模組中已沒有some變數,因而發生錯誤。你可以在del與被匯入模組同名的變數,之後再度使用import設回該變數。例如:
再次匯入模組,可以設回與被匯入模組的同名變數,但不會再度執行被匯入模組,import模組時只會執行模組一次,再次import是不會再度執行模組的。
如果想要知道現在到底匯入了多少模組,則可以使用sys.modules得知,這是個字典物件。例如:
如果你使用del刪除某個與被匯入模組同名的變數,並不會 影響 sys.modules。例如:
如果你想要改變被匯入模組在當前模組中的變數名稱,則可以使用import as。例如:
import as改變的是被匯入模組在當前模組的名稱,而不是sys.modules中的名稱,以上例來說,sys.modules中的名稱仍然是some。上例比較像是:
可以使用from import語句建立與被匯入模組中相同的變數名稱。例如:
上例比較像是:
但如果是可變動物件,例如:
則會有以下的結果:
Python是個不斷演進的語言,有些新語法或功能會不相容於舊版本Python,甚至破壞舊版本Python原本的功能,如果你想要體驗一下將來版本可能有的新語法或功能,則可以透過__future__模組。例如在Python 2.6中,print是個陳述句,而在Python 3中,print是個函式,若要在Python 2.6中使用Python 3中的print函式,則可以:
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']) >>> |
如果你使用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] >>> |
Python是個不斷演進的語言,有些新語法或功能會不相容於舊版本Python,甚至破壞舊版本Python原本的功能,如果你想要體驗一下將來版本可能有的新語法或功能,則可以透過__future__模組。例如在Python 2.6中,print是個陳述句,而在Python 3中,print是個函式,若要在Python 2.6中使用Python 3中的print函式,則可以:
from __future__ import print_function