python程序的最后关头,是怎么样的呢?

53 views
Skip to first unread message

bones7456

unread,
May 31, 2010, 5:25:56 AM5/31/10
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
今天,有人问我一个python的问题,把我搞的郁闷了,给大家也看看:
问题可以这样重现:打开《A Byte of Python》的类变量那节,可以看这里:
http://www.ibiblio.org/g2swap/byteofpython/read/class-and-object-vars.html

然后把中间的那示例代码复制下来,运行,也确实能得到正确的结果,但是,现在把代码里的所有“swaroop”换成“xxx1”,再把所
有“kalam”换成“yyy1”,再运行,就会得到一个奇怪的错误:
Exception AttributeError: "'NoneType' object has no attribute
'population'" in <bound method Person.__del__ of <__main__.Person
instance at 0xb68138ec>> ignored

也就是说,换了个变量名,就出错了。。。
这个邪门的问题,应该是python的内存回收机制造成的,换了名字以后,估计是Person这个类本身,先于类的对象被回收掉了~
关于这种问题,有啥文档不?或者有啥好办法可以避免么?

Leo Jay

unread,
May 31, 2010, 5:58:09 AM5/31/10
to pyth...@googlegroups.com
2010/5/31 bones7456 <bone...@gmail.com>:


下面的那部分代码不要直接写在最外面,放到一个函数里。
比方说你写一个main函数,代码写在main函数里,最外面只写一个对main的调用。
就不会有这样的问题了。

解决方案是永远不要自己写__del__函数。这个函数没什么用,跟C++的析构函数不是一回事。

--
Best Regards,
Leo Jay

bones7456

unread,
May 31, 2010, 6:12:17 AM5/31/10
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
那这个算python的bug吧?python完全可以建立一个各对象的依赖树,然后按次序干掉各部分的。
这种和变量名相关的特性,很不应该吧?

On May 31, 5:58 pm, Leo Jay <python.leo...@gmail.com> wrote:
> 2010/5/31 bones7456 <bones7...@gmail.com>:


>
> > 今天,有人问我一个python的问题,把我搞的郁闷了,给大家也看看:
> > 问题可以这样重现:打开《A Byte of Python》的类变量那节,可以看这里:

> >http://www.ibiblio.org/g2swap/byteofpython/read/class-and-object-vars...

Leo Jay

unread,
May 31, 2010, 6:31:27 AM5/31/10
to pyth...@googlegroups.com
2010/5/31 bones7456 <bone...@gmail.com>:

> 那这个算python的bug吧?python完全可以建立一个各对象的依赖树,然后按次序干掉各部分的。
> 这种和变量名相关的特性,很不应该吧?
>

大概吧,反正python的文档里是把这个问题列在bugs里的。
http://docs.python.org/c-api/init.html#Py_Finalize

不过话说回来,就算是bug也不严重,这个bug要有N多条件才出现:
1. 对象放在module那一层
2. 类重定义了__del__
3. __del__里用到类本身
4. module退出的时候刚好类比对象先析构

bones7456

unread,
May 31, 2010, 7:01:43 AM5/31/10
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
呵呵,果然是这样,解构的时候,是随机的。。。
关于这个问题,我总结了下,写在我blog里了:
http://li2z.cn/2010/05/31/python__name__main__/

On May 31, 6:31 pm, Leo Jay <python.leo...@gmail.com> wrote:
> 2010/5/31 bones7456 <bones7...@gmail.com>:
>

Heroboy

unread,
May 31, 2010, 8:47:53 AM5/31/10
to pyth...@googlegroups.com


2010/5/31 bones7456 <bone...@gmail.com>

那这个算python的bug吧?python完全可以建立一个各对象的依赖树,然后按次序干掉各部分的。
这种和变量名相关的特性,很不应该吧?
有循环引用就不是树 了,是图。
--
来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com
退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc
详情: https://groups.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp

Reply all
Reply to author
Forward
0 new messages