作为一个python小白,在学习的初期道路上,总是遇到很多小坎坷。希望通过简书记录的方式,夯实基础,减少重复犯错。请大家一起多多交流学习。
每每在需要比较大小或者判断变量内容是否相同的时候卡住。=, ==, is 到底有什么样的差别。
首先,在Python中,一切都是对象(Object)。
其次,Python中对象包含三个基本要素,ID(身份标识),Type(数据类型),Value(值)
=:用于赋值,不用做比较
==:比较两个对象的内容是否相同(数值相等或者字符相同)
is:比较两个对象的ID是否相同(是否指向同一个内存地址)
Example1
>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> id(a)
4489883912
>>> id(b)
4489883912
>>> c = [1, 2, 3]
>>> d = [1, 2, 3]
>>> d is c
False
>>> d == c
True
>>> id(c)
4491242696
>>> id(d)
4491509128
上例中a, b, c, d 四个变量的值都是相等的,但是只有a和b的ID是相同的,因为b是由a赋值得到的。在使用is进行判断时,由于ID不同,则得到False的结果。
Example2
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>> c = 1000
>>> d = 1000
>>> c is d
False
>>>c == d
True
此处a,b 变量ID相同是由于Python的对象缓存机制。Python将一些频繁使用的整数对象缓存起来,保存到一个叫small_ints的链表中,在Python的整个生命周期内,任何需要应用这些整数对象的地方,都不再创建新的对象,而是直接应用缓存中的对象。Python中定义的范围在[-5,256]。
Example3
>>> a = 'pythontab.com'
>>> b = 'pythontab.com'
>>> a is b
False
>>> a == b
True
>>> c = 'pythontabcom'
>>> d = 'pythontabcom'
>>> c is d
True
>>> c == d
True
显然是因为多了一个点导致不一样,解释是因为字符串类型不完全相同,与解释器实现有关(我还不是很明白这个原因)
Example4
# Tuple
>>> a = (1,2,3)
>>> b = (1,2,3)
>>> a is b
False
# List
>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a is b
False
# Dict
>>> a = {'python':100, 'com': 1}
>>> a = {'python':100, 'com': 1}
>>> a is b
False
# Set
>>> a = set([1,2,3])
>>> b = set([1,2,3])
>>> a is b
False
可见,在变量是数字,字符串,元组,列表和字典时, is 与 = 的结果都不相同。