专注细节
努力进步

python 弱引用

在 Python 中没有值类型、引用类型之类的区别。所有变量都只是指向对象内存地址的引用,而所有的对象都有一个唯一的序号,以及类型和值。对象类型并不能被修改,我们修改的不过是引用的内容而已。

复制代码
Code
>>>>>> a = 1
>>>>>> b = 1
>>>>>> hash(a)
1
>>>>>> hash(b)
1
>>>>>> id(a)
11228576
>>>>>> id(b)
11228576
复制代码

我们可以使用 sys.getrefcount() 查看对象引用计数。

复制代码
Code
>>>>>> import sys
>>>>>> class Class1:
pass

>>>>>> a = Class1()
>>>>>> sys.getrefcount(a)
2
>>>>>> b = a
>>>>>> sys.getrefcount(b)
3
>>>>>>
复制代码

我们可以进行 Shallow copy 或者 Deep Copy。

复制代码
Code
>>>>>> class Data:
pass

>>>>>> class Class1:
def __init__(self):
self.Data = Data()

>>>>>> a = Class1()
>>>>>> import copy
>>>>>> b = copy.copy(a)
>>>>>> a is b
False
>>>>>> a.Data is b.Data
True
>>>>>> c = copy.deepcopy(a)
>>>>>> c is a
False
>>>>>> c.Data is a.Data
False
>>>>>>
复制代码

weak reference

弱引用使用的机会不是很多,一般用来进行 cache 编程。我们可以使用 weakref.ref() 来创建一个弱引用。

复制代码
Code
>>>>>> import sys
>>>>>> import weakref
>>>>>> class Class1:
def Foo(self):
print “Foo”

>>>>>> o = Class1()
>>>>>> sys.getrefcount(o)
2
>>>>>> r = weakref.ref(o) # 创建一个弱引用
>>>>>> sys.getrefcount(o) # 引用计数并没有改变
2
>>>>>> r

>>>>>> o2 = r() # 获取弱引用所指向的对象
>>>>>> o2 is o
True
>>>>>> sys.getrefcount(o)
3
>>>>>> o = None
>>>>>> o2 = None
>>>>>> r # 当前对象引用计数为零时,弱引用失效

>>>>>>
复制代码

weakref 还提供了一个 proxy()。

复制代码
Code
>>>>>> import sys
>>>>>> import weakref
>>>>>> class Class1:
def Foo(self):
print “Foo”

>>>>>> def callback(self):
print “callback”

>>>>>> o = Class1()
>>>>>> p = weakref.proxy(o, callback)
>>>>>> p.Foo()
Foo
>>>>>> o = None
callback
>>>>>>
复制代码

分享到:更多 ()