python教程—Python3变量名中的一个简单差别能改变代码运行的方式吗?(复制)-Python实用宝典

python教程—Python3变量名中的一个简单差别能改变代码运行的方式吗?(复制)

这个问题已经有了答案:这个代码…产生以下错误…但这段代码没有。

这个问题已经有了答案:

这段代码…

    class Person: num_of_people = 0 def __init__(self, name): self.name = name Person.num_of_people += 1 def __del__(self): Person.num_of_people -= 1 def __str__(self): return 'Hello, my name is ' + self.name cb = Person('Corey') kb = Person('Katie') v = Person('Val')

产生以下错误…

    Exception AttributeError: "'NoneType' object has no attribute 'num_of_people'" in <bound method Person.__del__ of <__main__.Person object at 0x7f5593632590>> ignored

但这段代码没有。

    class Person: num_of_people = 0 def __init__(self, name): self.name = name Person.num_of_people += 1 def __del__(self): Person.num_of_people -= 1 def __str__(self): return 'Hello, my name is ' + self.name cb = Person('Corey') kb = Person('Katie') vb = Person('Val')

我看到的唯一区别是最后一个变量名是“vb”vs。“v”。

我正在学习Python,现在正在做OOP方面的工作。

回答

是的,虽然不是变量名直接导致的。

当Python退出时,所有模块也被删除。清理模块的方法是将模块中的所有全局变量设置为None(因此这些引用不再引用原始对象)。这些全局变量是dictionary对象中的键,由于dictionary的顺序是任意的,重命名一个变量可以改变清除变量的顺序。

当您将v重命名为vb时,您改变了清除变量的顺序,现在Person是最后清除的。

一种解决方法是使用type(self)。num_of_people -= 1 in the _del__ method instead:

    def __del__(self): type(self).num_of_people -= 1

因为实例始终会有对类的引用,或者测试Person是否没有设置为None:

    def __del__(self): if Person is not None: Person.num_of_people -= 1

两个笔记:

  • CPython 3.4不再将全局变量设置为None(在大多数情况下),因为安全对象终结;参见PEP 442

  • CPython 3.3自动将一个随机哈希盐应用于全局字典中使用的str键;这使得您观察到的行为更加随机,只是多次重新运行代码可能会触发错误消息,也可能不会。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论