>>> class C:
        def __init__(self):
                print("我是__init__")
        def __del__(self):
                print("我是__del__")
                
>>> c1 = C()
我是__init__
>>> c2=c1
>>> del c2
>>> del c1
我是__del__
>>> c3=C()
我是__init__
>>> c3
<__main__.C object at 0x0000000002FB8B00>
>>> c4=c3
>>> del c4
>>> del c3
>>> c5=C()
我是__init__
>>> c5
我是__del__
<__main__.C object at 0x0000000002F71630>3个回答
官方文档说了(这里),所以别用__del__,估计是历史遗留问题,所以在python的新版本里还留着。
用del删除变量,不代表.__del__被调用了。
只要C类object被删除,就会触发__del__(self)。
你的代码里面del c2,并没有触发,因为c2只是指向了c1,而不是一个真正的object。而删除c1的时候触发了__del__(self),所以print生效。
你后面的代码在我电脑上并没有实现出来。我的结果如下:
我再给你一个例子
class C:
    def __init__(self):
            print("here __init__")
    def __del__(self):
            print("here __del__")
            
def Test(val):
    a = C()
    return val
x = Test(3)在Test函数中,a被创建,因为是临时变量而且没有被return,所以函数调用之后,a就被自动消灭了。
所以你看的结果应该是
here __init__
here __del__SofaSofa数据科学社区DS面试题库 DS面经
				函数里调用后删除变量空间这些我都懂,你把代码分部运行下,不要多步一起运行
				- 
             塔利班
           
				
          
          2019-04-12 07:47
			
				嗯,分开跑就出现了和你一样的情况了,我也不清楚了。不过看了Jiho链接的文档感觉是变量被删除但是实际空间没有被释放导致的。
				- 
             sasa
           
				
          
          2019-04-12 09:03
			
def __init__(self):定义了一个对象被创建后的行为
def __del__(self):定义了一个对象被销毁后的行为
SofaSofa数据科学社区DS面试题库 DS面经
				你这个说了和没说差不多,而且del是即将被销毁的行为
				- 
             塔利班
           
				
          
          2019-04-12 07:48
			
    
  相关讨论
  随便看看