Python3 == 和 is 的区别

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()
    原文作者:LZ_Luzhuo
    原文地址: https://blog.csdn.net/Rozol/article/details/79383063
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞