在 Python 中没有值类型、引用类型的类区别所有变量都只是指向对象内存地址引用而所有对象都有个唯序号以及类型和值对象类型并不能被修改我们修改不过是引用内容而已
>>> a = 1
>>> b = 1
>>> hash(a)
1
>>> hash(b)
1
>>> id(a)
11228576
>>> id(b)
11228576
我们可以使用 sys.getrefcount 查看对象引用计数
>>> import sys
>>> Class1:
pass
>>> a = Class1
>>> sys.getrefcount(a)
2
>>> b = a
>>> sys.getrefcount(b)
3
我们可以进行 Shallow copy 或者 Deep Copy
>>> Data:
pass
>>> Class1:
def __init__(self):
self.data = Data
>>> a = Class1
>>> 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 来创建个弱引用
>>> import sys
>>> import weakref
>>> Class1:
def test(self):
pr "test..."
>>> o = Class1
>>> sys.getrefcount(o)
2
>>> r = weakref.ref(o) # 创建个弱引用
>>> sys.getrefcount(o) # 引用计数并没有改变
2
>>> r
<weakref at 00D3B3F0; to 'instance' at 00D37A30> # 弱引用所指向对象信息
>>> o2 = r # 获取弱引用所指向对象
>>> o is o2
True
>>> sys.getrefcount(o)
3
>>> o = None
>>> o2 = None
>>> r # 当对象引用计数为零时弱引用失效
<weakref at 00D3B3F0; dead>
weakref 还提供了个 proxy
>>> import sys
>>> import weakref
>>> Class1:
def test(self):
pr "test"
>>> def callback(self):
pr "callback"
>>> o = Class1
>>> p = weakref.proxy(o, callback)
>>> p.test
test
>>> o = None
callback
最新评论