天天看點

python基礎補充

  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這樣的字元串類型,以及元組都是不可變的;

   清單、字典、類、類執行個體等都是可變的;

執行個體:

總結:不可變對象(整數等)真正的被複制, 可變對象隻是複制了一個對它們的引用,即在記憶體中隻有一份對象,而有兩份引用;

這就涉及到一個 ”深拷貝“ 的問題