Python3 == 和 is 的区别

发布时间:2019-09-03 08:55:52编辑:auto阅读(1460)

    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()

关键字