首页 > 解决方案 > 为什么我不能在 Python 中删除(删除)静态列表的明显“现有实例”?

问题描述

我的目的如下:如果创建了新实例,则必须将该实例添加到静态列表中。并且当一个创建的实例被删除时,它必须从静态列表中删除

并且终结器方法,必须使用' del ()'。

我遇到问题的python代码如下:

class Staff:
    staffs = []  # static customer list

    def __init__(self, name):
        self.name = name
        print("A staff is created!")

    def __del__(self):
        Staff.staffs.remove(self)
        print("A staff is deleted!")

if __name__ == '__main__':
    # create a staff
    Staff.staffs.append(Staff("Harry"))

    # delete a staff
    Staff.staffs[0].__del__()

错误如下:

异常被忽略:<function Staff. 删除0x0000028A3675EF70>

回溯(最近一次调用最后):文件“(路径)\temp.py”,第 11 行,在del Staff.staffs.remove(self)

ValueError: list.remove(x): x 不在列表中

我可以检查创建的实例是否存在于静态列表中,如下面的代码

def check(self):
    print("Length of Static List:", len(Staff.staffs))
    print("self", self)
    for a_staff in Staff.staffs:
        if a_staff == self:
            print("a_staff", a_staff)
    print()

结果:

静态列表长度:1

self < main .Staff 对象位于 0x000001FF7506CFD0>

a_staff < 0x000001FF7506CFD0 处的主要.Staff 对象>

实例的内存地址完全一样,但我不知道为什么解释器说静态列表中没有实例。

当我在 Java 中运行类似的代码时没有问题。

为什么会发生错误?

标签: pythonstaticinstance

解决方案


注意

class Staff:
    staffs = []  # static customer list

    def __init__(self, name):
        self.name = name
        print("A staff is created!")

    def delete(self):
        Staff.staffs.remove(self)
        print("A staff is deleted!")

if __name__ == '__main__':
    # create a staff
    Staff.staffs.append(Staff("Harry"))

    # delete a staff
    Staff.staffs[0].delete()

工作正常。我所做的只是重命名__del__为删除。您可以尝试解释其上的文档,其中指出

由于调用del () 方法的不稳定环境,在它们执行期间发生的异常将被忽略,而是向 sys.stderr 打印警告。

上面的引用解释了你的错误。但是,正如其他帖子概述__del__的那样,

99.9% 的时间都不需要的非常低级的方法

所以只使用上面的代码就足够了,它将您的实例标记为垃圾收集。

如果您必须向__del__命令添加其他内容,请尝试以下操作:

class Staff:
    staffs = []  # static customer list

    def __init__(self, name):
        self.name = name
        print("A staff is created!")

    def __del__(self):
        print("A staff is deleted!")

if __name__ == '__main__':
    # create a staff
    Staff.staffs.append(Staff("Harry"))

    print(f"The length of Staff before delete is: {len(Staff.staffs)}")
    # delete a staff
    del Staff.staffs[0]
    print(f"The length of Staff after delete is: {len(Staff.staffs)}")

这输出:

创建了一个员工!
删除前的 Staff 长度为:1 删除
了一个员工!
删除后的 Staff 长度为:0

因此该项目被删除,您的文本被打印,无一例外!


推荐阅读