作者Tiberius (渴望平凡的幸福)
看板Python
标题Re: [问题] 新手请益
时间Sat Mar 21 04:28:47 2009
※ 引述《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)
1F:推 qazq:感谢!上了一课!题外话~T大都不用睡觉的阿?= =+ 03/21 11:29
2F:→ Tiberius:浪费时间 blue 掉了 = =+ 03/21 15:54