1.python对象

python中

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

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

    • 类型 type()

    • 值

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

    •  

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

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

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

      • 下列对象布尔值是false

       

None
False
所有的值为0的数
(整型)
0.0 (浮点型)
0L (长整型)
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 的内存地址 >>> 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用于判断两个引用所指的对象是否相同。

python对象、引用的更多相关文章

  1. Python 对象的引用计数和拷贝

    Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...

  2. Python对象的循环引用问题

    目录 Python对象循环引用 循环引用垃圾回收算法 容器对象 生成容器对象 追踪容器对象 结束追踪容器对象 分代容器对象链表 何时执行循环引用垃圾回收 循环引用的垃圾回收 循环引用中的终结器 pyt ...

  3. python征程3.0(python对象)

    1.python使用对象模型来存储数据.构造任何类型的值都是一个对象.”尽管python被当成一种面向对象的脚本的编程语言“,但你完全能够写出不使用任何类和实例的脚本. python对象都拥有三个特性 ...

  4. python 对象

    python 对象 在python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且不能再栈空间上生存.本文主要对Python的基本数据类型做简单的介绍. PyO ...

  5. Python对象(译)

    这是一篇我翻译的文章,确实觉得原文写的非常好,简洁清晰 原文链接:http://effbot.org/zone/python-objects.htm ------------------------- ...

  6. Python对象体系揭秘

    Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://doc ...

  7. python学习笔记:python对象

    一.python对象 python使用对象模型来存储数据,构造任何类型的值都是一个对象.所有的python对象都拥有三个特性:身份.类型和值. 身份:每个对象都有一个唯一的身份标识自己,对象的身份可以 ...

  8. Python对象类型及其运算

    Python对象类型及其运算 基本要点: 程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改) 每个对象都有一个身份.一个类型.一个值 例: >>> a1 = ...

  9. python的引用计数分析(二)

    python所有对象引用计数被减少1的情况: 一.对象的别名被赋予新的对象; a = 23345455 # 增加了一个引用 b = a # 增加了一个引用 print(sys.getrefcount( ...

随机推荐

  1. LabVIEW 波形图表显示多条曲线

    如何在波形图表中显示多条曲线呢? 首先看看波形图表的说明,请查看labVIEW 帮助 图 1 波形图表控件的即时帮助信息   关键就在绑定多个点. 图 2 利用捆绑函数将多个信号捆绑成簇   图 3 ...

  2. java后台发送请求并获取返回值(续)

    在java后端发送请求给另一个平台,从而给前端实现 "透传"的过程中,出现:数据请求到了并传到了前端,但是控制台打印时中文显示Unicode码而前端界面中中文显示不出来!!!开始怀 ...

  3. Ex 2_16 给定一个无穷数组..._第二次作业

    先比较数组的A[0]元素,若不相等接下来比较A[1],A[2],A[4],A[8]…,若找到一个区间A[2n-1]<x<A[2n],再对这个区间进行折半查找操作.总的时间为O(logn). ...

  4. appium+java (六) 手机chrome浏览器操作

    一.前言 早之前写过一段时间的appium for native app(即原生app脚本),但尴尬的是从未写过类似的文章,后期有时间我会陆续接着写,近一阶段有时间又把appium捡起来了,由于公司产 ...

  5. for循环中按条件删除数据元素

    var managerList = [ { id: 0, title: '小小消息的标题1', small: '小小消息内容', newsFlag:true, }, { id: 1, title: ' ...

  6. 机器学习之SVD分解

    一.SVD奇异值分解的定义 假设是一个的矩阵,如果存在一个分解: 其中为的酉矩阵,为的半正定对角矩阵,为的共轭转置矩阵,且为的酉矩阵.这样的分解称为的奇异值分解,对角线上的元素称为奇异值,称为左奇异矩 ...

  7. Confluence 6 让 Jira 应用停止发送通知到 Confluence

    你可能希望仅仅配置 Confluence 在 workbox 中仅仅显示自己的通知,禁用在 workbox 中显示从 Jira 来的通知.有可能这个 Jira 的应用已经通过应用链接功能正确链接到 C ...

  8. LeetCode(121):买卖股票的最佳时机

    Easy! 题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买 ...

  9. LeetCode(118):杨辉三角

    Easy! 题目描述: 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: [ [1], [1,1] ...

  10. php 数组函数学习

    1.array_change_key_case array_change_key_case(array,case)函数将数组的所有的键都转换为大写字母或小写字母.array表示目标数组,case表示转 ...