在内存中创建了一个对象,这时,无法直接使用它,将这个对象赋值给一个变量, 这之后,就可以通过这个变量来操作这个对象了,这就相当于给这个对象起一个名字一样。
变量,只是内存中对象的引用,这个变量指向了内存中的对象。所谓变量的内存地址, 本质上是这个对象的内存地址。
a = 4
id(a)
94110026193576
var = 4
var = 6
var = 4
id(var)
94110026193576
var = 6
id(var)
94110026193640
程序输出结果是:94554355440360
class A:
def __del__(self):
print("销毁对象")
a = A()
print('改变a的指向')
改变a的指向
a = 6
print('完成对象回收')
销毁对象 完成对象回收
为了验证对象的销毁,定义一个类 A
,由它创建的对象是不可变对象。
重载了它的 __del__
方法,
这个方法是在垃圾回收时调用的。根据1.3中所讲述的知识,当 a
重新赋值为 6
时,
之前在内存中创建出的类 A
的实例由于没有变量指向它将会被回收,回收过程中,
一定会调用实例的 __del__
方法,在两个 print
语句执行中间,一定会输出'销毁对象',
执行上面的代码,实际输出结果和预期相符。
a = [1]
a.append(2)
print(a)
[1, 2]
上面的代码执行时,内存中究竟是怎样变化的呢?
lst = [1, 2]
print(id(lst))
139840031156352
lst = [1, 2, 3]
print(id(lst))
139840031148800
程序输出结果是
140263273322176
140263273332032
结合前面的内容来理解一下上面的代码,两次输出的内存地址是不一样的,这说明,
lst = [1, 2, 3]
在内存中创建了一个新的列表对象,lst
最初指向 140094096850432
,
后来指向 140094096805312
, 没有变量指向内存地址位于 140094096850432
的列表,
这个列表最后会被系统回收销毁。