Python中的引用比较、值比较与对象池
来源:互联网 发布:淘宝怎样开直通车 编辑:程序博客网 时间:2024/06/05 03:27
主要内容:
- Python里的值比较用==,引用比较用is
- Python与Java一样,都有对象池
Python是一种很彻底的面向对象的语言
为会要说彻底呢? 因为是与Java相比。 Java虽说也是OOP的,但还保留了基本数据类型:int, long, double, float, etc.
。而在Python里,所有的变量都是以对象形式存在。
a = 1;print(isinstance(a,object))
True
is 和 ==
我们一般都是通过操作对象的引用来操作对象,而对象的引用从本质上来说只是对象的地址值。在Java里, obj1==obj2
比较的是两个变量的地址值,而它们所指向的值;要比较对象的值是否相同,应该使用obj1.equals(obj2)
. 而在Python里, obj1==obj2
比较的是两个变量的值;若要比较它们的地址/id,则使用关键字is
:
a = 1000b = 1000c = aprint(a == b)print(c is a)print(c is b)
TrueTrueFalse
对象池
(是不是叫这个名字不大确定)
若把上面例子中的1000改成100,你会发现一个奇怪的现象,变量c
与变量b
居然id也相等了
a = 100b = 100c = aprint(a == b)print(c is a)print(c is b)
TrueTrueTrue
Why? 熟悉Java的都知道,为了提高效率,JVM维护了一个共用的对象池。对整数来说,Java会将128以内(即0到127)的整数存在pool里。若用户要求创建一个128以内的Integer时,JVM不会真去创建一个新的对象, 而是直接从这个pool里将对应整数对象的引用返回。而Python也有类似的机制,但范围不是128以内了。让我们写段代码来找出这个范围:
def test(val): s = '%d'%(val) a = eval(s) b = eval(s) return (a is b)
for i in range(0, 512): if not test(i): print(i) break;
257
可见,Python将0~256
放在了pool里。
0 0
- Python中的引用比较、值比较与对象池
- python核心编程中的对象值比较VS对象身份比较
- php中的类与对象(对象比较)
- C# 对象比较(值类型、引用类型)
- 引用与指针比较
- 值比较和引用比较在java中的运用
- Python 中的比较方法 is与==的比较
- Java与C/C++比较——对象引用方面
- java中的对象比较
- php5中的对象比较
- Java中的对象比较
- java 中的对象比较
- python中的比较
- java-对象的引用、对象的比较
- 指针与引用的比较
- c++ 与java引用比较
- 引用与指针的比较
- 引用与指针的比较
- 微信小程序实用小组件:自定义tabbar
- Java实现 双链表互换任意两个节点
- CentOS 7.1 rpm安装 MySQL
- 字符串中最后一个单词的长度
- armeabi和armeabi-v7a
- Python中的引用比较、值比较与对象池
- 股市编程问题的解决方案
- 金融类APP产品:搭载运营手段提高用户数据指标
- 性能优化之数据存储&DOM编程
- 为什么要写博客,由此而发
- Android 中进度计算--百分比显示
- Hadoop浅解海量数据处理算法——Bloom Filter实现
- 博弈总结
- 更换jdk版本 输入java -version还是出现原来的版本号