zoukankan      html  css  js  c++  java
  • Python 学习笔记 8.引用(Reference)

    转载自: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
    >>>>>>
  • 相关阅读:
    网页添加提示音
    poj 2593和poj 2479
    HDU 1558 Segment set
    Ubuntu中conky的安装配置
    Codeforce C. Buns
    HDU 3952 Fruit Ninja
    IE8,IE9,IE10,FireFox 的CSS HACK
    HDU 1086 You can Solve a Geometry Problem too
    Ubuntu中Cairo Dock安装和设置
    Ubuntu 12.04 中安装和配置 Java JDK(转)
  • 原文地址:https://www.cnblogs.com/sislcb/p/1284828.html
Copyright © 2011-2022 走看看