免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9047 | 回复: 10
打印 上一主题 下一主题

请教Python中的变量定义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-04 22:32 |只看该作者 |倒序浏览
初学Python,写了个简单的程序,老是有问题

  1. #!/usr/bin/python
  2. # Filename: class.py

  3. class Person:
  4.         '''Defination of class Person'''
  5.         count=0        
  6.        
  7.         def __init__(self,name):
  8.                 '''defination of constructor'''
  9.                 self.name = name
  10.                 Person.count+=1
  11.                 print self.name,'is created'

  12.         def __del__(self):
  13.                 '''defination of destructor.'''
  14.                 print 'says bye to %s' %self.name

  15.                 Person.count-=1               
  16.                 if Person.count==0:
  17.                         print self.name,'is the last one.'
  18.                        
  19.         def howmuch(self):
  20.                 return Person.count
  21.                        
  22.         def sayhello(self):
  23.                 print 'hello,',self.name       

  24. p = Person('edward')

复制代码


运行结果

  1. edward is created
  2. says bye to edward
  3. Exception exceptions.AttributeError: "'NoneType' object has no attribute 'count'" in <bound method Person.__del__ of <__main__.Person instance at 0xb7e96c4c>> ignored
复制代码


找了半天原因,原来问题出在这里
  1. p = Person('edward')
复制代码

改成
  1. pedward = Person('edward')
复制代码

以后,问题解决了.
但是却不知道到底是为什么.难道python中不允许用比较短的变量名吗,有人知道原因不,请告诉一声,谢谢了.

论坛徽章:
0
2 [报告]
发表于 2006-06-05 09:42 |只看该作者
应该不是变量的问题。
看提示好像是你计数器的问题。
不用Person.count,改用self.count应该更好吧。

PS:你的程序我运行没有问题。

论坛徽章:
0
3 [报告]
发表于 2006-06-05 10:39 |只看该作者
可能是我们用的python的版本不一样,而我用的版本有bug吧

论坛徽章:
0
4 [报告]
发表于 2006-06-06 19:03 |只看该作者
把  count=0      
改成 self. count=0

论坛徽章:
0
5 [报告]
发表于 2006-06-07 09:15 |只看该作者
这个错误是由于对象销毁的顺序造成的。即Person类先销毁,其后实例p销毁的时候找不到Person类故出错。
但是,另一个问题是为什么变量名用p的时候是Person类先销毁,而用pedward的时候确是实例先销毁呢?如果说是偶然,为什么在不同的机器上都是这样呢?如果说是必然,又有什么根据呢?难道变量的名字真的能影响到其在命名空间中的顺序?

论坛徽章:
0
6 [报告]
发表于 2006-06-10 08:02 |只看该作者
stone.zh和jkit说得很有道理,将变量名称改成以下划线开头或者先手动销毁对象都可以解决这个问题,原文如下

Starting with version 1.5, Python guarantees that globals whose name begins with a single underscore are deleted from their module before other globals are deleted;


严格地说,这应该是Python的一个bug,为什么会出现这个问题了,我觉得一般来说,一个语言的符号表都是Hash 表,没有什么可说的,变量在其中的顺序肯定是和变量的名字有关的.在销毁这些对象的时候Python可能患了个愚蠢的错误,那就是依次按照顺序去销毁这些对象,显然这样是不合理的.对象的销毁顺序应该是有优先级的.肯定要先局部后全局.

[ 本帖最后由 shaohui 于 2006-6-10 12:33 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2006-06-10 10:55 |只看该作者
看来 Python 有必要引入“引用记数”一类的技术。

论坛徽章:
0
8 [报告]
发表于 2006-06-10 13:39 |只看该作者
什么意思?python就是这样的处理的呀。当del一个对象时并不是直接释放,而是对这个对象的引用计数减1。为0时释放。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2006-06-10 14:50 |只看该作者
原帖由 limodou 于 2006-6-10 13:39 发表
什么意思?python就是这样的处理的呀。当del一个对象时并不是直接释放,而是对这个对象的引用计数减1。为0时释放。

是吗?
我不太清楚 Python 的实现,
不过楼主碰到的问题,
如果 Person 的释放是引用数减一的话,那么 p 还没有释放值钱,Person 就不应该真正释放,
那么前面的几位朋友所说的情况(因为 Person 销毁了,因此 p 销毁时出问题)应该就不对了哦。

论坛徽章:
0
10 [报告]
发表于 2006-06-10 22:16 |只看该作者
Person 是个类的名字哈,是全局的,肯定是唯一的,所以引用记数对于它来说没有用的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP