1.is 是比较内存地址id 2.== 是比较两个变量的值
在Python 3.7.2中测试,其他版本可能结果不同。
对于字符串,测试如下:
a = "123sa123"
b = a # 与 b = "123sa123" 结果一样
print(id(a)) # 1380015214704
print(id(b)) # 1380015214704
print(id(b) is id(a)) # 返回 False
print(id(b) == id(a)) # 返回 True
print( b == a) # 返回 True
print( b is a) # 返回 True
对于数字,测试如下:
a = 888
b = 888 # b = a 的下面测试结果相同
print("888:",id(a)) # 140716076429968
print(id(b)) # 140716076429968
print(id(b) is id(a)) # 返回 False
print(id(b) == id(a)) # 返回 True
print( b == a) # 返回 True
print( b is a) # 返回 True
a = 5//2
b = 2
print("数字运算a:", id(a)) # 140716076426096
print("数字b:", id(b)) # 140716076426096
print("id(b) is id(a):", id(b) is id(a)) # 返回 False
print("id(b) == id(a):", id(b) == id(a)) # 返回 True
print("b == a:", b == a) # 返回 True
print("b is a:", b is a) # 返回 True
对于列表,
a = ["abc","opp"]
b = ["abc","opp"] # b = a 的结果不同
print("列表a:", id(a)) # 140716076429968
print("列表b:", id(b)) # 140716076429968
print("id(b) is id(a):", id(b) is id(a)) # 返回 False
print("id(b) == id(a):", id(b) == id(a)) # 返回 False
print("b == a:", b == a) # 返回 True
print("b is a:", b is a) # 返回 False
# 与b = a 结果不同
b = a
print("列表a:", id(a)) # 2591324877064
print("列表b:", id(b)) # 2591324877064
print("id(b) is id(a):", id(b) is id(a)) # 返回 False
print("id(b) == id(a):", id(b) == id(a)) # 返回 True
print("b == a:", b == a) # 返回 True
print("b is a:", b is a) # 返回 True
对元组,
a = ("abc", 123)
b = ("abc", 123) # b = a 的结果相同
print("元组a:", id(a)) # 2655621982920
print("元组b:", id(b)) # 2655621982920
print("id(b) is id(a):", id(b) is id(a)) # 返回 False
print("id(b) == id(a):", id(b) == id(a)) # 返回 True
print("b == a:", b == a) # 返回 True
print("b is a:", b is a) # 返回 True
对字典,
a = {"abc":123,"zxc":"asd"}
b = {"abc":123,"zxc":"asd"} # b = a 的结果不同
print("字典a:", id(a)) # 2924215499512
print("字典b:", id(b)) # 2924215499944
print("id(b) is id(a):", id(b) is id(a)) # 返回 False
print("id(b) == id(a):", id(b) == id(a)) # 返回 False
print("b == a:", b == a) # 返回 True
print("b is a:", b is a) # 返回 False
# 与 b = a 不同
b = a
print("字典a:", id(a)) # 2742193192320
print("字典b:", id(b)) # 2742193192320
print("id(b) is id(a):", id(b) is id(a)) # 返回 False
print("id(b) == id(a):", id(b) == id(a)) # 返回 True
print("b == a:", b == a) # 返回 True
print("b is a:", b is a) # 返回 True
对集合,
a = (1,33,44,22,"9A")
b = (1,33,44,22,"9A")
print("数字运算a:", id(a)) # 140716076426096
print("数字b:", id(b)) # 140716076426096
print("id(b) is id(a):", id(b) is id(a)) # 返回 False
print("id(b) == id(a):", id(b) == id(a)) # 返回 True
print("b == a:", b == a) # 返回 True
print("b is a:", b is a) # 返回 True
总结:对于可变数据类型(列表、字典),即使变量a与b的值相同,但如果不是通过a,b间相互赋值(a=b),则变量a与变量b的内存地址不同,即id不同,a is b的结果返回为False。
对于不可变数据类型(数字、字符串、元组、集合),只要变量a与变量b的值相同,不管是直接赋值还是通过变量赋值,则变量a与变量b的内存地址都相同,即id相同,a is b的结果返回为True。