zoukankan      html  css  js  c++  java
  • python对象、引用

    1.python对象

    python中

    所有的python对象都有3个特征: 身份,类型和值

      • 身份: 每个对象有一个唯一的身份标识自己,这个值可以被认为是该对象内存地址。id()查看。

      • 类型 type()

      • 标准类型,也成为基本数据类型
        • 数字(分为几个子类型,其中有3个是整型)
        • 整型
        • 布尔型
        • 浮点型
        • 复数型
        • 字符串
        • 列表
        • 元组
        • 字典
      • 其它内建类型
        • 类型
        • Null对象(None)
        • 文件
        • 集合/固定集合
        • 函数/方法
        • 模块
      • 核心笔记:布尔值

      •  
        • 所有标准对象均可用于布尔测试,同类型之间可以比较大小.

        • 每个对象天生具有布尔值 true 或 false。

        • 空对象,值为0的任何数字或者Null对象None的布尔值都是false

        • 下列对象布尔值是false

         
    None
    False
    所有的值为0的数
    0 (整型)
    0.0 (浮点型)
    0L (长整型)
    0.0 + 0.0j (复数)
    "" 空字符串
    [] 空列表
    () 空元组
    {} 空字典
    
    bool([]) #bool()函数测试
    >>> bool([])
    False
    
    值不是上面列出来的是true

    对象身份的比较:is is not 对象就像一个装着内容的盒子(内存地址)。当一个对象被赋值到一个变量,就像在盒子上贴了一个标签 表示创建了一个引用。每当这个对象有了新的引用,就会在盒子上新贴上一张标签。当一个引用被销毁,标签化就会 撕掉。而每个对象都有一个引用计数器来记录引用的次数,当引用为0,对象销毁.

    2.引用

    不可变数据对象:数字和字符串,元组,不能改变对象本身(不能再当前内存地址对该对象改变,要获得新的值的再开辟内存存储对象),只能改变引用的指向,称为不可变数据对象(immutable object)。

    可变数据对象:可以通过引用其元素,改变对象自身(in-place change)。这种对象类型,称为可变数据对象(mutable object),字典,列表,集合。

    例子1:

    >>> a = 2  #赋值就创建了一个指向 对象 "2"  的引用a.
    >>> id(a)  #对象 2 的内存地址
    24834392
    >>> a = 'banana' #将 引用a 指向了对象‘banana’.
     >>> id(a) 139990659655312

    内存中建立了一个字符串对象‘banana’,通过赋值 将 引用a 指向了 ‘banana’,同时,对象1不在有引用指向它,它会被python的内存处理机制给当我垃圾回收,释放内存。

    例子2:  

    >>> a = 3
    >>> b = 3
    >>> id(a)
    10289448
    >>> id(b)
    10289448

    #对象 3 存在2个应用 a 和 b

    例子3:

    1.  a = 4

    2.  b = a(这里就是让引用b指向引用a指向的那个对象)

    3.  a = a + 2

    >>> a = 4
    >>> b = a
    >>> id(a)
    36151568
    >>> id(b)
    36151568

    可以看到 a 和 b 都指向了 整数对象 4
    >>> a = a+2
    >>> id(a)
    36151520
    >>> id(b)
    36151568

    可以看到 a 的引用改变了,但是 b 的引用未发生改变;a,b指向不同的对象;第3句对 a 进行了重新赋值,让它指向了新的 对象6;即使是多个引用指向同一个对象
    ,如果一个引用值发生变化,那么实际上是让这个引用指向一个新的引用,并不影响其他的引用的指向。从效果上看,就是各个引用各自独立,互不影响。

    例子4: 可变对象引用

    1.   L1 = [1, 2, 3]

    2.   L2 = L1

    3.   L1[0] = 10

    当执行第1步 和 第二步 的时候,查看一下 L1 和 L2 的引用情况:
    
    >>> L1 = [1,2,3]
    >>> L2 = L1
    >>> id(L1)
    139643051219496
    >>> id(L2)
    139643051219496
    
    此时 L1 和 L2 的引用相同,都是指向 [1,2,3]这个列表对象。
    接下来,继续执行第3步:
    
    >>> L1[0] = 10
    >>> id(L1)
    139643051219496
    >>> id(L2)
    139643051219496
    >>> L2
    [10, 2, 3]
    
    L1 和 L2 的引用没有发生任何变化,但是 列表对象[1,2,3] 的值 变成了 [10,2,3](列表对象改变了)
    我们不再对L1这一引用赋值,而是对L1所指向的表的元素赋值。结果是,L2也同时发生变化。

    原因何在呢?因为L1,L2的指向没有发生变化,依然指向那个表。表实际上是包含了多个引用的对象(每个引用是一个元素,比如L1[0],L1[1]..., 每个引用指向一个对象,

    比如1,2,3), 。而L1[0] = 10这一赋值操作,并不是改变L1的指向,而是对L1[0], 也就是表对象的一部份(一个元素),进行操作,所以所有指向该对象的引用都受到影响。

    is关键字:

        当然,我们也可以要想知道是否指向同一个对象,我们可以使用 python的 is 关键词,is用于判断两个引用所指的对象是否相同

  • 相关阅读:
    C语言之数组中你所不在意的重要知识
    Word2007怎样从随意页開始设置页码 word07页码设置毕业论文
    天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能
    高速排序算法
    Cocos2d-x中停止播放背景音乐
    Netflix公司监控内部安全的开源项目
    Linux内核——进程管理与调度
    WebService之Soap头验证入门
    Google搜索解析
    android-sdk-windows版本号下载
  • 原文地址:https://www.cnblogs.com/yitianyouyitian/p/8622747.html
Copyright © 2011-2022 走看看