python中的is, ==与对象的相等判断
一、python对象的"==、is"比较
"""
1、python的比较总是检查复合对象的所有部分,直到可以得出结果为止。
2、会自动遍历嵌套的所有数据结构,有多深走多深,首次发现的差值将决定比较的结果
"""
"""
== :操作符测试值的相等性
is :表达式测试对象的一致性,表示同一个对象,在同一内存地址中
输出结果:
True False
"""
L1 = [1,('A',2)]
L2 = [1,('A',2)]
print L1 == L2,L1 is L2
"""
关于短字符串的一致性比较特殊:
python内部暂时储存并重复使用短字符串作为最佳化,实际内存中只有一个字符串'spam‘供S1、S2分享
输出结果:
True True
"""
S1 = "SPAM"
S2 = "SPAM"
print S1 == S2,S1 is S2
"""
当比较的字符串较长时 is比较结果为False
运行结果:False
"""
S11 = "a longer strnig"
S22 = "a longer string"
print S11 is S22
"""
列表、字典、元组、自定义程序类型的一致性判定(is)
以下判定结果均为False,因为都不是一个对象,内存地址不一样
"""
l = [1,3,'a']
print l is list
d = {1:1,'a':'b'}
print d is dict
t = (1,2,3)
print t is tuple
class A(object):
def init(self):
print "object is born!"
a = A()
print a is A
print '---------------'
a1 = 1
a2 = 1
print a1 is a2 #返回True
二、python对象的大小比较规则:
"""
1、数字通过相对大小进行比较
2、字符串按照字典顺序(编码顺序),一个字符接一个字符进行比较
3、列表和元组从左到右对每部分的内容进行比较
4、字典通过排序后的(键,值)列表进行比较,pyton3.0中不支持
5、数字混合类型pyton3.0中不支持,拼音。6中允许
"""
运行结果:[True, True, True, True]
print [33 < 99,'abc' < 'ac',{'a':1,'b':2} > {'a':1,'B':2},1 < 'spam']
嵌套比较
"""
运行结果:False False True
"""
Li1 = [1,('a',3)]
Li2 = [1,('a',2)]
print Li1 < Li2,Li1 == Li2,Li1 > Li2
python为不同的对象如何分配内存的小知识
id方法的返回值就是对象的内存地址。
python中会为每个出现的对象分配内存,哪怕他们的值完全相等(注意是相等不是相同)。如执行a=2.0,b=2.0这两个语句时会先后为2.0这个Float类型对象分配内存,然后将a与b分别指向这两个对象。所以a与b指向的不是同一对象:
a=2.0
b=2.0
a is b
False
a==b
True
但是为了提高内存利用效率对于一些简单的对象,如一些数值较小的int对象,python采取重用对象内存的办法,如指向a=2,b=2时,由于2作为简单的int类型且数值小,python不会两次为其分配内存,而是只分配一次,然后将a与b同时指向已分配的对象:
a=2
b=2
a is b
True
如果赋值的不是2而是大的数值,情况就跟前面的一样了:
a=5555
b=5555
a is b
False
id(a)
12464372
id(b)
12464396