Re: [問題] 新手請益
前輩大家好 我是剛學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
03/21 04:07, 1F
※ 編輯: leondemon 來自: 140.129.77.5 (03/21 04:13)
討論串 (同標題文章)