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
原创粉丝点击