作者StubbornLin (Victor)
看板Python
標題Re: [問題]一些觀念的釋疑?
時間Tue Sep 30 12:30:01 2008
※ 引述《tumc (HIHIHI)》之銘言:
: 想請問一些不太確定的問題
: 1.
: 若
: A = Aclass()
: B = A
: 則A是Aclass的instance本身?
: 或者A只是point到Aclass某個instance的變數?
: B確定只是一個pointer?
A和B都是指向Aclass instance的reference
(要講pointer其實也可以 但感覺reference比較正確)
Python中的所有變數名稱,都是reference
今天你設定一個變數
A = 1
就是產生一個值為1的實體,把A指向到此實體,接著又這樣寫
A = 2
就是產生一個值為2的實體,把A指向到此實體,那原本的1呢?
事實上1在此時可能還在,如果沒有人指向它的話
過一陣子應該就會被回收掉了
而
A = 1
B = A
其實就是A和B都指向 1 這個物件的實體
如果說你不確定某個變數指向的實體到底和另一個一不一樣
你可以用 id() 函數 印出它唯一的id來確認
或是
A is B 這樣的式子
: ======
: 2.
: Linst=[]
: for inst in [Aclass(no=1),Aclass(no=2)... ]:
: Linst.append(inst)
: Pke_Linst = pickle.dumps(Linst)
: 想請問的是Pke_Linst打包起來的是一個Aclass instance的串列?
: 或者只是一堆pointer的串列?
pickle有一個機制可以自動幫你打包大部份的物件
甚至是你自己寫的物件,雖然說變數都是reference
可是pickle會幫你自動去做處理 你也可以改寫某些特別的方法
來針對pickle行為特化的樣子 不知道有沒有記錯
一般而言大部份常見的物件物資料結構都可以被pickle
但有些就不能,例如open('xxx.txt', 'rt')這類的物件
當然就無法pickle
一個測試的方法,就是你把pickle出來的東西存成檔案
關掉python程式,再次執行然後load進來
不過有些東西雖然可以被pickle,但是遇到太深的結構
會有呼叫堆疊溢出的問題,像我之前用BeautifulSoup所產生的物件
進行pickle,某些網頁就會發生這種問題
我有大概看過它原始碼,pickle是用遞迴寫的,所以如果走訪過深的話就會堆疊溢出
--
易記學 程式設計教學
http://ez2learn.com/
易記學 程式設計討論區
http://forum.ez2learn.com
VICTOR's 個人Blog
http://blog.ez2learn.com/
財報分析王
http://victorlin.serveftp.org/stock/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.170.87.108
→ rexrainbow:"B = A" 還可以在分得更細, 例如A=0 及 A=[0] 09/30 13:09
→ StubbornLin:嗯 可改變和不可改變 09/30 13:50