一、对象
在Python中,一切皆对象。每个对象由:标识(identity)、类型(type)、值(value) 组成。
1、标识用于唯一标识对象,通常应对于对象在计算机内存中的地址。使用内置函数id(obj)可返回对象obj的标识。
2、类型用于标识对象存储的“数据”的类型。类型可以限制对象的取值范围以及可执行的操作。可以使用type(obj)获得对象的所属类型。
3、值标识对象所存储的数据的信息。使用print(obj)可以直接打印出值。
对象的本质就是:一个内存块,拥有特定的值,支持特定类型的相关操作。
二、引用
在Python中,变量也称为:对象的引用。因为,变量存储的就是对象的地址。
变量通过地址引用了“对象”。
变量位于:栈内存
对象位于:堆内存
- Python是动态类型语言
变量不需要显式声明类型。根据变量引用的对象,Python解释器自动确定数据类型。
- Python是强类型语言
每个对象都有数据类型,只支持该类型支持的操作。
三、同一运算符
同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址。
| 运算符 | 描述 |
|---|---|
| is | is是判断两个标识符是不是引用同一个对象 |
| is not | is not是判断两个标识符是不是引用不同对象 |
is与 == 的区别:
is 用于判断两个变量引用对象是否为同一个,即比较对象的地址。
== 用于判断引用变量引用对象的值是否相等,默认调用对象的__eq__()方法。
- 整数缓存问题
Python仅仅对比较小的整数对象进行缓存(范围为[-5,256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化(范围是[-5,任意正整数])。
- 总结
- is比较两个对象的id值是否相等,是否指向同一个内存地址;
- == 比较的是两个对象是否相等,值是否相等;
- 小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用;
- is 运算符比 == 效率高,在变量和None进行比较时,应该使用is。