import random
print random.choice(range(10))
和
from random import choice
print choice(range(10))
第一種方法:将子產品的名字設定為一個隐含在名字空間裡的全局變量,這樣就好像通路全局屬性那樣通路choice函數;
第二種方法:直接把choice引入到全局名字空間裡來(而非子產品的名字),是以不再需要把這個屬性當初子產品的成員,實際上我們也隻是擁有這個屬性而已;
python中存在的誤解:以為第二種方法隻導入了個函數,而沒有導入整個子產品,這個不對的;整個子產品已經被導入了,但是隻有那個函數的引用被儲存下來,所有;from-import
這種文法并不能帶來性能上的差異,也沒有節省記憶體一說;
很多人擔憂的一個問題是有兩個子產品m.py 和n.py都導入了foo.py子產品,當m導入n時,foo豈不是被導入了兩次?簡單的說,當python碰到一個已經加載的子產品又被導入時,
它會跳過加載的過程,是以無需擔心額外消耗記憶體的問題;
這個問題不能簡單的使用是或者不是來回答,隻能說看情況而定-----有的對象在傳入函數時是傳引用,而有些則是被複制進來,即傳值;判斷的依據就是看對象的可改變性(mutability),而這一點取決于對象的類型;python程式員通常不用“傳值”還是“傳引用“這種說法,取而代之的是對象是可變的(mutable)還是不可變的(immutable)。
簡單的類型或者“标量”類型,包括整數或其他數字類型,str 和 unicode這樣的字元串類型,以及元組都是不可變的;
清單、字典、類、類執行個體等都是可變的;
執行個體:
總結:不可變對象(整數等)真正的被複制, 可變對象隻是複制了一個對它們的引用,即在記憶體中隻有一份對象,而有兩份引用;
這就涉及到一個 ”深拷貝“ 的問題