WEB开发网
开发学院软件开发Python [Python 学习笔记] 7: Reference 阅读

[Python 学习笔记] 7: Reference

 2009-10-13 00:00:00 来源:WEB开发网   
核心提示:在 Python 中没有值类型、引用类型之类的区别,所有变量都只是指向对象内存地址的引用,[Python 学习笔记] 7: Reference,而所有的对象都有一个唯一的序号,以及类型和值,>>>importsys>>>importweakref>>>classCl

在 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

Tags:Python 学习 笔记

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接