Re: [問題] 新手請益

看板Python作者 (狗狗)時間15年前 (2009/03/21 04:00), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串15/16 (看更多)
前輩大家好 我是剛學python不到一個禮拜的新手 多多指教... 因為我不是資訊背景 也才剛接觸python (為了parse....) 若是用詞有錯 請告訴我唷 不過看了這一系列的文章 我發現到下面有趣事情耶...(Mac OS 10.5.6、python 2.5.1) -- 例子1 指派簡單的文字和數字 給予一個變數 >>> x = 3 >>> x is 3 True >>> x = '3' >>> x is '3' True -- 例子2 當文字出現了空格 指派給予一個變數 >>> id('3 ') 432320 >>> id('3 ') 432320 >>> x = '3 ' >>> x is '3 ' False >>> id('3 ') #位址改變了 432608 >>> id('3 ') 432608 -- 例子3 文字順序的變化 id位址皆為2重複 >>> id('3 ') #測試含有space的字串 432288 >>> id('3 ') #連續找尋位置兩次 位址不變 432288 >>> id(' 3') #不同順序的文字 結果位址一樣 432288 >>> id(' 3') 432288 >>> id('3 ') #即使回頭看原本的順序 位址還是沒變 432288 >>> id('3 ') 432288 >>> id('3') #若只剩下一個字元 則位址改變了 432576 >>> id('3 ') #這時再回頭看原本字串時 位址變了 432640 >>> id('3 ') 432640 >>> id(' 3') #但是同字串不同順序的文字 位址會是同樣的地方 432640 >>> id(' 3') 432640 >>> id('123') #換了不同字串 結果位址還是一樣! 432640 >>> id('123') 432640 >>> id('345') #同上一樣含有'3' 432640 >>> id('345') 432640 >>> id('789') #在換一個截然不同的字串 結果位址一樣 432640 >>> id('789') 432640 >>> id('3') #再看回字串'3' 結果位址又跳回432576 跟之前一樣 432576 >>> id('3') 432576 >>> id('789') #不意外 再回頭看原本的字串 位址重新被指定了 431936 >>> id('789') 431936 >>> id('I love you') #把字串內的數字換成含space的文字試試看 結果位址變了 439384 >>> id('I love you') 439384 >>> id('83920382903820') #那再把字串換回龐大數字 位址卻沒變 439384 >>> id('83920382903820') 439384 >>> id('789') #再換成小的數字 結果位址竟然又改變了!而且跟之前不一樣 432608 >>> id('789') 432608 >>> id('333') #換成別的數字呢 結果位址還是沒變 432608 >>> id('333') 432608 >>> id('OH') #從數字換成簡單的文字 位址沒變! 432608 >>> id('OH') 432608 >>> id('OH MY GOD') #但是將文字換成含space的文字時 位址又改變了 439384 >>> id('OH MY GOD') 439384 >>> id('OH MY BABY') #換個不同的複雜字串 位置依然沒變 439384 >>> id('OH MY BABY') 439384 >>> id('We bring nothing into the world') #更複雜呢?結果變了 261832 >>> id('We bring nothing into the world') 261832 >>> id('OH MY BABY') #回頭看看原本字串的位址 結果還在那邊 439384 >>> id('OH MY BABY') 439384 >>> id('789') #讓我們看看老朋友在哪裡 結果跟最後出現的位址一樣!! 432608 >>> id('789') 432608 >>> id('money') #換成單字也不變位址 432608 >>> id('money') 432608 >>> id('m') #但是換成字母 位址又變了 138304 >>> id('m') 138304 >>> id('o') #換成另外一個字母 也還是變了 291168 >>> id('o') 291168 >>> id('n') #再換另外一個字母呢? 也是變了... 184000 >>> id('n') 184000 >>> id('o') #回頭看看字母o的位址 還是在那邊 291168 >>> id('o') 291168 >>> id('m') #回頭看看字母m的位址 還是在原地 138304 >>> id('m') 138304 >>> id('3') #很久以前有出現過的'3' 位址還是一樣 432576 >>> id('3') 432576 >>> id('We bring nothing into the world') #記得這句話嗎? 位址依然一樣 261832 >>> id('We bring nothing into the world') 261832 >>> id('thanks')#再換回單字 位址跟第一次出現'123','345','789'一樣! 432640 >>> id('thanks') 432640 -- 例子4 承上 指派有space和沒有space給予一個變數時... >>> x = 'thanks' >>> id(x) #將變數設定為此單字時 位址竟然變了! 432608 >>> x is 'thanks' True >>> x = 'OH' #同樣變數設定為別的單字 還是改變! >>> id(x) 432416 >>> x is 'OH' True >>> x = '333' #換成數字 也是改變! >>> id(x) 431936 >>> x is '333' True >>> x = 'OH' #在例子3中 id('333')換成id('OH')位址不變 但是設定變數卻會改變 >>> id(x) #而且位址是跟'thanks'一樣的位址! 432608 >>> x is 'OH' True >>> id('thank you') #這是最後最重要的測試 當使用含有space的字串時.... 439184 >>> x = 'thank you' #將x設定為此字串 >>> id(x) 439184 #x的位址跟原本字串位址的一樣 >>> id('thank you') 439304 #但是原本相同內容的字串位址卻變了 >>> x is 'thank you' False #所以出現了前面沒有出現過False >>> id('999955556666') #這時候測試巨大數字 發現位址跟之前例子3一樣 不會變 439304 >>> x = '999955556666' #再次把x指派為此巨大數字 看看是否會跟上個反應一樣 >>> id(x) 439304 #不意外 x的位址是如預期 >>> id('999955556666') 439304 #但是此巨大數字的位址 卻沒有改變 >>> x is '999955556666' True #而結果還是出現true -- 例子5 回到一開始的問題 >>> x = '3' >>> x is '3' True >>> x = '3 ' #測試含space的字串 >>> x is '3 ' False -- 例子6 數字位數的變化 >>> id(3) 8402288 >>> id(33) 8401928 >>> id(3) 8402288 >>> id(33) 8401928 >>> id(333) 8404916 >>> id(3) #始終不變 8402288 >>> id(33) #始終不變 8401928 >>> id(333) #跟上次出現的位址不一樣 8404952 >>> id(3333) #跟'333'一樣 8404952 -- 例子7 數字256附近的變化 做兩次 >>> id(255) 8405288 >>> id(256) 8405276 >>> id(257) 8404928 >>> id(258) #跟257一樣 8404928 >>> id(255) #跟上次一樣 8405288 >>> id(256) #跟上次一樣 8405276 >>> id(257) #跟上次不一樣 8404916 >>> id(258) #跟257一樣 8404916 -- 例子8 奇怪符號 做兩次 >>> id('a') 253024 >>> id('b') 253088 >>> id('c') 291072 >>> id('!') 432640 >>> id('@') 432608 >>> id('#') 138720 >>> id('a') #跟上次一樣 253024 >>> id('b') #跟上次一樣 253088 >>> id('c') #跟上次一樣 291072 >>> id('!') #跟上次一樣 432640 >>> id('@') #跟上次一樣 432608 >>> id('#') #跟上次一樣 138720 -- 例子9 不同變數指定為同一含有space的字串時 >>> x = 'thank you' >>> y = 'thank you' >>> x is 'thank you' False >>> y is 'thank you' False >>> x is y False -- 以下為我的發現和推測... (用字不正確 或內容有錯 就請多多指教囉) 1)數字256以內 和 任何單一字元 位址永遠不變 (似乎跟16進位有關) 即一開始就被定義好位址 2)數字超過256 或一個字元 其位址就並非永遠固定 如換成16進位後 其位數不同 會有不同的位址等待被寫入 若是位數相同 則會在同樣位址重複寫入 3)承上 若是下一個指派的位數不同而跳到別的位址去記憶時 下次再輸入回原本位數的字串 則不一定會回到原本位址 有可能有適合的清單 4)當一個字串被派為一個變數時 其字串位址就會被固定 直到沒有變數指定為止 但若是字串中含有space 則被指派給一個變數後 新輸入相同字串的位置會改變 -- 以上我是胡亂猜測 希望有高人願意解釋一下囉~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.129.77.5 ※ 編輯: leondemon 來自: 140.129.77.5 (03/21 04:04) ※ 編輯: leondemon 來自: 140.129.77.5 (03/21 04:05)

03/21 04:07, , 1F
另外發現space換成!@也是一樣...
03/21 04:07, 1F
※ 編輯: leondemon 來自: 140.129.77.5 (03/21 04:13)
文章代碼(AID): #19m_NiLv (Python)
討論串 (同標題文章)
文章代碼(AID): #19m_NiLv (Python)