是的,尽管不是很多直接导致此问题的变量名称。
当Python退出时,所有模块也会被删除。清除模块的方法是将模块中的所有全局变量设置为
None(这样,这些引用就不再引用原始对象)。这些全局变量是字典对象中的键,并且由于字典是任意排序的,因此重命名一个变量可以更改清除变量的顺序。
当您重命名
v到
vb,你改变了哪些变量被清除,现在的顺序
Person是最后的清除。
一种解决方法是
type(self).num_of_people -= 1在
__del__方法中使用:
def __del__(self): type(self).num_of_people -= 1
因为实例将始终仍然引用该类,或者测试if
Person是否未设置为
None:
def __del__(self): if Person is not None: Person.num_of_people -= 1
两个注意事项:
None
根据安全对象完成,CPython 3.4不再将全局变量设置为(在大多数情况下);参见PEP 442。CPython 3.3自动将随机哈希盐应用到字典中
str
使用的键globals
;这使您观察到的行为更加随机,仅几次重新运行代码可能会或可能不会触发错误消息。



