[Python 学习笔记] 7: Reference
2009-10-13 00:00:00 来源:WEB开发网在 Python 中没有值类型、引用类型之类的区别。所有变量都只是指向对象内存地址的引用,而所有的对象都有一个唯一的序号,以及类型和值。对象类型并不能被修改,我们修改的不过是引用的内容而已。
>>> a = 1
>>> b = 1
>>> hash(a)
1
>>> hash(b)
1
>>> id(a)
11228576
>>> id(b)
11228576
我们可以使用 sys.getrefcount() 查看对象引用计数。
>>> import sys
>>> class Class1:
pass
>>> a = Class1()
>>> sys.getrefcount(a)
2
>>> b = a
>>> sys.getrefcount(b)
3
我们可以进行 Shallow copy 或者 Deep Copy。
>>> class Data:
pass
>>> class 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
>>> class Class1:
def test(self):
print "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
>>> class Class1:
def test(self):
print "test"
>>> def callback(self):
print "callback"
>>> o = Class1()
>>> p = weakref.proxy(o, callback)
>>> p.test()
test
>>> o = None
callback
更多精彩
赞助商链接