考虑以下示例代码
class A:
def __init__(self, i):
self.i = i
print("Initializing object {}".format(self.i))
def __del__(self):
print("Deleting object {}".format(self.i))
for i in [1, 2]:
a = A(i)
在循环中创建对象旨在确保在创建新的 A 对象之前调用 A 的析构函数。但显然发生了以下情况:
Initializing object 1
Initializing object 2
Deleting object 1
Deleting object 2
为什么只有在新对象初始化后才调用对象 1 的析构函数?这是预期的行为吗?我知道 for 循环在 python 中没有自己的范围。例如,在 C++ 中,1 的析构函数肯定会在对象 2 的构造函数之前被调用(至少如果对象是在循环中声明的)。
在我的程序中,我想确保在创建新对象之前删除旧对象。除了在 for 循环末尾显式删除 a
之外,还有其他可能性吗?
提前致谢。
最佳答案
第二个对象的创建发生在名称被重新绑定(bind)和第一个对象被释放之前。
- 第一个
A
被实例化。 a
已绑定(bind)。- 第二个
A
被实例化。 a
被反弹,第一个A
被处理掉。- 程序结束,第二个
A
被处理掉。
关于python - 在对象的第二次初始化时,为什么 __init__ 在 __del__ 之前被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5702944/