Python3 == 和 is 的区别

2023-01-31 04:01:06 区别 python3

本文由 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()

相关文章