作者leondemon (狗狗)
看板Python
标题Re: [问题] 新手请益
时间Sat Mar 21 04:00:42 2009
前辈大家好 我是刚学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)
1F:→ leondemon:另外发现space换成!@也是一样... 03/21 04:07
※ 编辑: leondemon 来自: 140.129.77.5 (03/21 04:13)