首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

大侠请留步! python ID 有关问题

2012-09-05 
大侠请留步!!! python ID 问题Python codefoo xyzxxfoo2 x+yzfoo3x+yzprint foo is foo2p

大侠请留步!!! python ID 问题

Python code
foo = 'xyz'x='x'foo2 = x+'yz'foo3='x'+'yz'print foo is foo2print foo is foo3print id(foo2)print id(foo3)

请问为什么foo2、foo3的Id不同呢?麻烦讲下原理

[解决办法]
id 代表一个对象的标示

在 python 中,字符串本身是不可修改的。如果函数修改字符串,那么都是生成会返回一个新的字符串对象。
所以上例中,貌似 foo, foo2, foo3,x 都是不同的对象
[解决办法]
噗~
每个对象都天生具有一个计数器,记录它自己的引用次数。这个数目表示有多少个变量指向该对象。Python提供了is 和is not操作符来测试两个变量是否指向同一个对象。


整型对象和字符串对象是不可变对象,所以python会很高地缓存它们。这会造成我们认为Python应该创建新对象时,它却没有创建新对象的假象。
Python仅缓存简单类型,因为它认为Python应用程序中小整型会被经常用到。


所以你例子中两个字符串变量指向的是同一个对象
[解决办法]

连接字符串,会申请一个新内存空间,大小为合并的各个字符串的大小之合,然后将需要连接的字符串的内容拷贝到这个内存里去,照理说每次应该都是一个新的对象。 
但是貌似小的字符串,它可能不会构建新的对象,而将变量直接指向原有的缓冲池里的对象,并且引用计数+1

http://blog.donews.com/lemur/archive/2005/12/22/667710.aspx

热点排行