Python 中 is 的问题

wyfwx 2010-09-01 10:44:22
a=b=4
a is b
结果:True

c=4
a is c
结果:True

d=2+2
a is d
结果:True

感觉c 和 d 应该不和a,b指向同一个对象的啊?
那位熟悉的给我解下惑
...全文
129 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
feilniu 2010-09-02
  • 打赏
  • 举报
回复
Python 3.1原码中小整数池的范围定义:

/* longobject.c */
/* Long (arbitrary precision) integer object implementation */
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS 257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS 5
#endif

notax 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wyfwx 的回复:]

引用 2 楼 i_nbfa 的回复:
python会缓存小整数对象而已(为了提高分配效率), 你把abcd赋10000再试试.


确实是不是一个对象了,为何呢?难道是超出一个字节了,需要额外分配内存
[/Quote]

python 2.5, 2.6的 vm 起动的时候就把 -5 到 257 分配到内存去了
wyfwx 2010-09-01
  • 打赏
  • 举报
回复
ok,感谢
I_NBFA 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wyfwx 的回复:]
引用 2 楼 i_nbfa 的回复:
python会缓存小整数对象而已(为了提高分配效率), 你把abcd赋10000再试试.


确实是不是一个对象了,为何呢?难道是超出一个字节了,需要额外分配内存
[/Quote]
NO, 你要明白现有的垃圾收集机制意味着对象要被分配在heap上, stack中频繁分配不成问题,
但heap的分配效率本来就比stack低, 而且又是链式结构, 如此会造成大量分配碎片.
所以python会缓存频繁使用的小整数对象提高效率, 范围根据版本会有所变化, 一般是1到100左右.
而大对象只能直接分配了. 不然跟踪的代价不是极高, 而是根本不现实.
wyfwx 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 i_nbfa 的回复:]
python会缓存小整数对象而已(为了提高分配效率), 你把abcd赋10000再试试.
[/Quote]

确实是不是一个对象了,为何呢?难道是超出一个字节了,需要额外分配内存
cchb1986 2010-09-01
  • 打赏
  • 举报
回复
notax 2010-09-01
  • 打赏
  • 举报
回复
"is" 比一比id 就是了

>>> a=b=4
>>> id(a)
135716628
>>> id(b)
135716628
>>> a is b
True
>>> a is 4
True
>>> id(4)
135716628
>>> d=4
>>> id(d)
135716628
>>> a is d
True
I_NBFA 2010-09-01
  • 打赏
  • 举报
回复
python会缓存小整数对象而已(为了提高分配效率), 你把abcd赋10000再试试.
李察德-泰森 2010-09-01
  • 打赏
  • 举报
回复
a,b,c,d 都指向同一个对象4,4在内存中只有一个存放位置,也可以看做是对象 4 有四个别名,名字分别是a,b,c,d

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧