Re: [問題] 新手請益

看板Python作者 (渴望平凡的幸福)時間15年前 (2009/03/21 04:28), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串16/16 (看更多)
※ 引述《leondemon (狗狗)》之銘言: : 前輩大家好 我是剛學python不到一個禮拜的新手 多多指教... : 因為我不是資訊背景 也才剛接觸python (為了parse....) 若是用詞有錯 請告訴我唷 : 不過看了這一系列的文章 我發現到下面有趣事情耶...(Mac OS 10.5.6、python 2.5.1) 下面太長了所以不引 XD 基本上你說的沒錯, 短的 string 會被 intern 這是因為 python 的字串 immutable (內容不可修改), 如果某個字串在很多地方用到的話, intern 起來可以增加使用效率 一來同樣的內容只需要存一份 二來比對字串的時候可以先比較所指位址是否相等 (比對一個整數, 瞬間完成) 位址不等的時候, 再實際去比對字串內容 (換句話說, a == b 未必比 a is b 慢, 如果想藉此加速的話請三思 :p) 哪些字串會「在很多地方用到」? dict keys ! python 到處都有用到 dict, 程式碼裡頭的變數、屬性、類別名稱都是 dict key 取變數, 取屬性都是 dict lookup, 所以這些名字基本上都會被 intern 至於你剛做的實驗, 有個很致命 (?) 的缺失 XD python 2.3 之後, intern 起來的字串如果沒有 reference 的話, 是會被釋放掉的 下面你測 id() 都沒有先把字串存進變數再測, 所以很可能馬上被釋放掉 導致之後出現的新字串用到先前用過的位址 ... 數字根本沒有 intern 的問題, 你這可能也是因為沒有 reference 導致直接被釋放掉了。 前面提到 python 的字串 immutable, 所以 a = 'hello' # a 指向 hello b = 'hello' # b 也指向 hello, a 跟 b 可能 (但不保證) 指向同一個 hello a += 'world' # a 指向 (位在另一個地方的) 'hello world' 每次修改字串, 都會產生一份全新的內容! 所以輸出資料的時候不要拼命 result += '...', 可能會很慢的 ... (ok, 2.4 之後其實有對這個特例做最佳化 字串內容沒被共享的話, 就不太會複製整個字串的內容) 比較好的作法應該是 result = [] result += ['hello'] result += [' world'] ... return ''.join(result) 總之 == 問的是「兩者是否等值」, is 問的是「兩者是不是同一個東西」 用 is 之前請三思 ... 別一不小心濫用了, 這東西用到的機會應該不多才對 ... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.117.40.88 ※ 編輯: Tiberius 來自: 122.117.40.88 (03/21 04:30)

03/21 11:29, , 1F
感謝!上了一課!題外話~T大都不用睡覺的阿?= =+
03/21 11:29, 1F

03/21 15:54, , 2F
浪費時間 blue 掉了 = =+
03/21 15:54, 2F
文章代碼(AID): #19m_o0yi (Python)
討論串 (同標題文章)
文章代碼(AID): #19m_o0yi (Python)