is 和 == 都是用来判断两个变量是否相等。

区别在于

  • is:判断两个变量的引用是否相等,值相同,引用不一定相同。
  • ==:判断两个变量的值是否相等,如果引用相同,则值一定相同


可以通过id() 这个函数查看对象的内存地址,如果内存地址相等也就说明引用相等。





a = 1b = 1print(id(a)) # 1575434496print(id(b)) # 1575434496print(a is b) # Trueprint(a == b) # Truea = 'hello world'b = 'hello world'print(a is b) # Trueprint(a == b) # True# 只有数值和字符串类型时,a  is b 才是True,而对于列表(list)、元组(tuple)、字典(dict)、集合(set) a is b 为Falsea = [1, 2, 3]b = [1, 2, 3]print(id(a)) # 55002536print(id(b)) # 55003696print(a is b) # Falseprint(a == b) # Truea = {'name': 'tom', 'age': 19}b = {'name': 'tom', 'age': 19}print(a is b) # Falseprint(a == b) # True
b = 1
print(id(a)) # 1575434496
print(id(b)) # 1575434496
print(a is b) # True
print(a == b) # True

a = 'hello world'
b = 'hello world'
print(a is b) # True
print(a == b) # True

# 只有数值和字符串类型时,a  is b 才是True,而对于列表(list)、元组(tuple)、字典(dict)、集合(set) a is b 为False
a = [1, 2, 3]
b = [1, 2, 3]
print(id(a)) # 55002536
print(id(b)) # 55003696
print(a is b) # False
print(a == b) # True

a = {'name': 'tom', 'age': 19}
b = {'name': 'tom', 'age': 19}
print(a is b) # False
print(a == b) # True


通过上面的例子,我们发现 对于整数和字符串,a is b 和 a == b都是True,而对于list、tuple、dict、set来说 a is b 为False,a == b才是True。



然而事实真是这样吗?


1、

实际上在python中,对于 -5 ~ 256 之间的整数(包含-5 和 256)都会初始化在内存中,所以当给变量赋值时,如果在这个区间中,他们都是指向同一个内存地址。如果一旦超过这个范围,或者非整数,则会分配新的内存空间。则会返回False。


在PyCharm中,因为对解释器做了优化,所以测试的时候哪怕超过这个范围a is b 也是返回True。所以我们在终端进行测试。





Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> a = -5>>> b = -5>>> print(a is b)True>>> a = -6>>> b = -6>>> print(a is b)False>>> a = 256>>> b = 256>>> print(a is b)True>>> a = 266>>> b = 266>>> print(a is b)False>>> a = 6.666>>> b = 6.666>>> print(a is b)False>>>.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = -5
>>> b = -5
>>> print(a is b)
True
>>> a = -6
>>> b = -6
>>> print(a is b)
False
>>> a = 256
>>> b = 256
>>> print(a is b)
True
>>> a = 266
>>> b = 266
>>> print(a is b)
False
>>> a = 6.666
>>> b = 6.666
>>> print(a is b)
False
>>>


2、

Python解释器有一个intern(字符串驻留)的机制,意思是同一个字符串只在常量池中保存一份,所以创建两个一样的字符串,他们都是指向了常量池中相同的地址。所以上述例子,也没有什么特别要解释的。


但是要注意的是,当字符串中有空格时,则不会触发intern机制(在Pycharm中优化了解释器,仍然会触发)





>>> a = 'helloworld'>>> b = 'hello' + 'world'>>> print(a is b)True>>> a = 'hello world'>>> b = 'hello world'>>> print(a is b)False>>>
>>> b = 'hello' + 'world'
>>> print(a is b)
True
>>> a = 'hello world'
>>> b = 'hello world'
>>> print(a is b)
False
>>>