Python3 == 和 is 的区别
本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/Rozol/article/details/79383063
以下代码以Python3.6.1为例
Less is more!
is 判断两个对象是否为同一对象, 是通过id来判断的; 当两个基本类型数据(或元组)内容相同时, id会相同, 但并不代表a会随b的改变而改变
== 判断两个对象的内容是否相同, 是通过调用eq()来判断的
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/19'
# equal_is_demo.py == 和 is 的区别
# == 和 is 的区别:
# is 判断两个对象是否为同一对象, 是通过id来判断的; 当两个基本类型数据(或元组)内容相同时, id会相同, 但并不代表a会随b的改变而改变
# == 判断两个对象的内容是否相同, 是通过调用__eq__()来判断的
import copy
def demo():
list_1 = [123]
list_2 = [123]
tup_1 = (123)
tup_2 = (123)
# --- is 判断两个对象是否为同一对象, 是通过id来判断的 ---
print("id_list_1: {}; id_list_2: {}; list_1 is list_1: {}".format(id(list_1), id(list_2), list_1 is list_2))
print("id_tup_1: {}; id_tup_2: {}; tup_1 is tup_2: {}".format(id(tup_1), id(tup_2), tup_1 is tup_2))
# 输出结果: 两列表id不同, is返回为False, 说明是根据id来判断的, 且非指向同一对象
# id_list_1: 109701200; id_list_2: 109701040; list_1 is list_1: False
# id_tup_1: 1485463184; id_tup_2: 1485463184; tup_1 is tup_2: True
# --- == 判断两个对象的内容是否相同, 是通过调用__eq__()来判断的 ---
print("id_list_1: {}; id_list_2: {}; list_1 == list_1: {}".format(id(list_1), id(list_2), list_1 == list_2))
print("id_tup_1: {}; id_tup_2: {}; tup_1 == tup_2: {}".format(id(tup_1), id(tup_2), tup_1 == tup_2))
# 输出结果: 不管id是否相同, 内容相同, ==返回都是True
# id_list_1: 109701200; id_list_2: 109701040; list_1 == list_1: True
# id_tup_1: 1485463184; id_tup_2: 1485463184; tup_1 == tup_2: True
# ======
# --- 注: 当两个基本类型数据(或元组)内容相同时, id会相同, 但并不代表a会随b的改变而改变 ---
temp_1 = 123
temp_2 = copy.copy(temp_1)
print("id_temp_1: {}; id_temp_2: {}; temp_1 is temp_2: {}; temp_1 == temp_2: {}".format(id(temp_1), id(temp_2), temp_1 is temp_2, temp_1 == temp_2))
# 输出结果: 此时他们具有相同的id, 相同的值, 所以is和==都返回True
# id_temp_1: 1485463184; id_temp_2: 1485463184; temp_1 is temp_2: True; temp_1 == temp_2: True
# 他们具有相同的id是因为基本数据类型(和元组)的内容相同, 所以为指向同一内存
# 如果我们修改temp_2的值, 那么temp_2的id也就随之改变, 而temp_1的值并未随之改变
# 不管是深拷贝, 还是浅拷贝, 结果都是一样的, 原因详见: [深浅拷贝文章](http://blog.csdn.net/rozol/article/details/71156387)
temp_2 = 456
print("temp_1: {}; temp_2: {}".format(temp_1, temp_2));
print("id_temp_1: {}; id_temp_2: {}; temp_1 is temp_2: {}; temp_1 == temp_2: {}".format(id(temp_1), id(temp_2), temp_1 is temp_2, temp_1 == temp_2))
# 输出结果: temp_2的id和内容都改变了, 所以is和==都返回False
# temp_1: 123; temp_2: 456
# id_temp_1: 1485463184; id_temp_2: 109502000; temp_1 is temp_2: False; temp_1 == temp_2: False
if __name__ == "__main__":
demo()