Python 实例化对象,一开始都是同一个么?

2014-12-20 09:57:03 +08:00
 invite
class Item:
pass

然后发现,print Item() , Item() , Item() 出来的都是一样的

但是
a = Item()
b = Item()
c = Item()

然后 print a , b , c 是不一样的。

求解惑。
3821 次点击
所在节点    问与答
7 条回复
imn1
2014-12-20 10:11:57 +08:00
? 没看明白
没有abc的情况下不叫实例化吧?
kcworms
2014-12-20 10:29:37 +08:00
用打印语句而不是print函数的时候每打印一个实例就垃圾回收掉一个
http://stackoverflow.com/questions/14011440/python-class-instances-referring-to-same-location
bcxx
2014-12-20 10:38:49 +08:00
Interesting, you can find out the reason (GC & print statment vs print function) with dis:

https://gist.github.com/bcho/010a9793776f3b89cdfd
sujin190
2014-12-20 12:31:53 +08:00
这个叫对象缓存,如果连续快速实例化然后释放该对象,那么极有可能生成的两个对象的id是一样的
Jex
2014-12-20 16:04:20 +08:00
Python FreeList,看来class new方法也用了这东西:
http://jex.im/programming/python-free-list-glimpse.html

见: http://svn.python.org/projects/python/trunk/Objects/classobject.c



```
PyObject *
PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
{
register PyMethodObject *im;
im = free_list;
if (im != NULL) {
free_list = (PyMethodObject *)(im->im_self);
PyObject_INIT(im, &PyMethod_Type);
numfree--;
}
else {
im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
if (im == NULL)
return NULL;
}
im->im_weakreflist = NULL;
Py_INCREF(func);
im->im_func = func;
Py_XINCREF(self);
im->im_self = self;
Py_XINCREF(klass);
im->im_class = klass;
_PyObject_GC_TRACK(im);
return (PyObject *)im;
}
```
Jex
2014-12-20 16:38:41 +08:00
@Jex 楼上的代码帖错了 -_-!
Jex
2014-12-20 16:42:11 +08:00
这个没有用free_list,是直接py malloc管理的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/155269

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX