python中is和==的区别:
首先我们先理解四个概念:
- 变量:可以是数字,也可以是任何数据类型
- 代码块:
python程序时由代码块组成。程序执行的最小基本单位是代码块。一个模块文件、一个函数体、一个类、交互式命令行中的单行代码都是一个代码块。凡是不可变对象在同一个代码块中的对象,只要值相等的对象都不会被重复创建。不仅是整型,字符串也遵循以上规则。 - 内存:
内存是电脑硬件用来存放数据的,可理解为:内存是由一个个小格子组成的,每个小格子大小是一个字节(byte),只能存放1byte的数据。当找这些数据时只能通过内存地址来查找。 - 地址:
地址是内存的标识符,相当于门牌号。
找内存地址-->操作内存-->表现为:操作变量
is和==的区别:
在python中一切皆对象,对象之间能否用“==”和“is”,区别在于:
- is比较两个对象的id值是否相等,爷爷就是比较两个对象是否为同一个实例对象,是否指向同一块内存
- ==比较两个对象内容是否相同,默认调用对象的__eq__()方法
- 于性能考虑,python内部做了很多优化工作,对于整数对象,python把一些频繁使用的整数对象缓存起来,保存到samll_ints的链表中。在python的整个生命周期中,任何调用这些小整数时都不需要再重新创建对象 ,范围是[-5,256]。
注意: - 小整数[-5,256]是全局解释器内重复使用,永远不会回收
- 同一个代码块中的不可变对象,只要值相等就不会创建新的对象
- 字符串中单个20以内,内存地址是一样的。并且不能有特殊字符,必须全部由字母组成,如果超过21则地址会不一样
- 在一个py文件中,情况类似,但有不一样的地方:
- int类型:只要在同一个代码块中的值相同则地址相同
- str类型:只要长度不超过20,哪怕含有特殊字符,地址也相同