Python类与对象

类与对象

1.检查对象类型

isinstance()函数能够实现继承,所以是检查所有Python对象类型的首选方式。过多的检查会影响性能。

2.引用计数和垃圾收集

所有的对象都有引用计数。使用del语句或者引用超出作用域时(或被重新赋值)时,对象的引用计数就会减少。使用 sys.getrefcount()函数可以获得对象的当前引用计数。

多数情况下,引用计数比你猜测的要大很多。对于不可变数据(如数字和字符串),解释器会主动在程序的不同部分共享对象,便于节约内存。

当一个对象的引用计数为零时,就会被垃圾收集机制处理掉。但是一些情况下,很多已不使用的对象间可能存在循环依赖关系。

a = {}
b = {}
a['b'] = b
b['a'] = a
del a
del b

del会减少a和b的引用计数,并销毁用于引用底层对象的名称。然而因为每个对象都包含一个对其他对象的引用,所以引用计数不会归零,对象也不会销毁(导致内存泄漏),为解决这个问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除他们。

3.浅复制和深复制

浅复制将创建一个新对象,但它包含的是对原始数据对象中包含的项的引用。

>>a = [1,2,[3,4]]
>>b = list(a)     #创建a的浅复制
>>b is a
False
>>b.append(100)
>>b
[1,2,[3,4],100]
>>a
[1,2,[3,4]]
>>b[2][0] = -100
>>b
[1,2,[-100,4],100]
>>a
[1,2,[-100,4]]

a和b是单独的列表对象,但他们包含的元素是共享的,因此修改a的一个元素也会修改b的对应元素

深复制将创建一个新对象,并且递归的复制它包含的所有对象

posted @ 2020-06-01 14:16  麦郎  阅读(111)  评论(0)    收藏  举报