转载自:http://www.xwy2.com/article.asp?id=113

 

在 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
<weakref at 01295840; to 'instance' at 00DC48A0>

>>>>>> o2 = r() # 获取弱引用所指向的对象

>>>>>> o2 is o
True
>>>>>>
sys.getrefcount(o)
3

>>>>>> o =
None
>>>>>> o2 =
None
>>>>>> r # 当前对象引用计数为零时,弱引用失效

<weakref at 01295840; dead>
>>>>>>

 

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
>>>>>>
posted on 2008-09-05 08:59  sislcb  阅读(5988)  评论(1编辑  收藏  举报