python中的is和==区别

1. is和==的区别

python是一种面向对象的语言,python中对象包含三种基本要素:id(返回的是对象的地址)、type(返回的是对象的数据类型)及value(对象的值)。

is和==都可以对两个对象进行比较,而且它们的返回值都是布尔类型。但是它们比较的内容是不同的,不然两个函数的作用就重复了。首先我们来看下例子,从实际操作中来看下二者的区别。

python中的is和==区别

从上面的例子可以得出,is和==比较的对象的内容时不同的,即:is比较的是两个对象的地址值,也就是说两个对象是否为同一个实例对象;而==比较的是对象的值是否相等,其调用了对象的__eq__()方法。

那么怎么才能让两个对象的地址值相等呢,如果想让一个对象ls2 is ls1返回True应该怎么操作呢,我们可以把ls1赋值给ls2,这样ls1和ls2指向的就是同一个内存地址,ls1 == ls2和ls1 is ls2返回的都是True。如下图所示:

python中的is和==区别

上面说到了赋值,那么接下来进一步说明赋值(=)、浅拷贝(copy())和深拷贝(deepcopy())的区别。

2. 赋值(=)、浅拷贝(copy())、深拷贝(deepcopy())的区别

赋值其实就是对对象的直接引用。例子如下:

python中的is和==区别

ls1 = ls赋值引用,ls1和ls都指向同一个对象。内存图如下所示:

                                                  python中的is和==区别

浅拷贝(copy()):拷贝父对象,不会拷贝对象内部的子对象。例子如下:

python中的is和==区别

但是在上面的例子中看不出子对象父对象关系,那我们用下面这个例子:

python中的is和==区别

dic1 = dic.copy():dic和dic1是独立的对象,但是它们的子对象[1,2,3,4]还是指向统一的对象。内存图如下所示:

                                             python中的is和==区别

深拷贝(deepcopy()):是copy模块中的方法,完全拷贝了子对象和父对象,例子如下:

python中的is和==区别

dic1 = deepcopy(dic):深度拷贝, dic1完全拷贝了dic父对象及其子对象,两者是完全独立的。内存图如下所示:

                                 python中的is和==区别