首先我们来分析一个问题,判断两个字符串是否相等?
>> a = "Hi"
>> b = "Hi"
>> a is b
True
>> a == b # 我们会发现两个的结果一样
True
再看这个例子
>> a = "I am using long string for testing"
>> b = "I am using long string for testing"
>> a is b
False
>> a == b
True
通过id()查看变量在内存中具体的存储空间
第一个例子的两个变量存储空间相同,第二个不同。造成is的结果不一样。
官方文档对这is和==两种的描述:
is : object identity(对象标示符)
== : equal(相等)
a is b 调用的是id(a) == id(b) 判断两个对象在内存中是否拥有同一块内存空间
a == b 相当于a.__eq__(b),调用内部的__eq__方法。
了解了区别之后我们再来分析一下上面两个例子,都是字符串,为何结果却不一样?
- 这是python中的string interning(字符串驻留)机制所决定的:对于较小的字符串,为了提高系统性能会保留其值的一个副本,当创建新的字符串的时候直接指向该副本。
网友评论