主要内容:
- 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 = 1000
b = 1000
c = a
print(a == b)
print(c is a)
print(c is b)
True
True
False
对象池
(是不是叫这个名字不大确定)
若把上面例子中的1000改成100,你会发现一个奇怪的现象,变量c与变量b居然id也相等了
a = 100
b = 100
c = a
print(a == b)
print(c is a)
print(c is b)
True
True
True
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里。
Python对象池与值比较
本文探讨了Python中对象池的机制及值比较方法。详细介绍了Python如何利用对象池优化小整数对象的管理和比较,并解释了==和is在值比较上的区别。
5039

被折叠的 条评论
为什么被折叠?



