看板 Python 關於我們 聯絡資訊
※ 引述《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