变量的比较方法

python中两个变量比较,应该有三种方法:
1. 值比较,就是比较变量引用的对象中的数据是否相同
2. 身份比较,就是判断两个变量是否引用的是同一对象,指向的内存地址是否相同
3. 类型比较,就是比较两个变量的类型是否相同

is的解释

在python语言中is是判断内存地址是否一致的。可以这样理解,在Python中,一切都是对象,每个对象都有一个身份,一个类型和一个值。这个身份就是内存中的地址(可以使用id()这个函数查看变量引用的对象的内存地址)。类型是指,这个变量引用的数据类型,包括一些自定义类型。这个值,就是变量引用的对象的具体数值,或者是字符串的内容等。
python使用is进行变量的身份比较,就是通过比较内存地址来判断是否引用的是同一个内存对象。

==的解释

==在python中就是进行值比较的,判断两个对象的值是否相同。但是如果比较的两个对象的值的话,最好是相同对象类型。否则比较则全部为False。

总结

有且当仅比较的两个变量指向同一个对象时 “is” 才返回 True,而 “==” 是说明指向同一个对象的两个变量的值是相等的。

所以,当”is” 返回为True时,”==”一定返回的是True,但是”==”返回的值为True,但是”is”不一定返回的是True。

也就是说,如果两个变量,他们的的引用对象即id是相同的,那他们的值就是相同的,如果两个变量的字面量是是相同的但是并不代表这两个变量id是相同的。

一些其他问题

这种问题可能是由于python内存机制引起的,Python2.7.13源码,/Objects/longobject.c中第26行说明了小整数是预先分配好以便共享,应该是为了效率考虑,在31行创建了一个small_ints的数组,37行的函数就是获取小整数引用的代码。小整数的范围在[-5, 257),所以对于小整数来说,id(number)是相同的,因为都是引用的同一块内存,同一个PyObject*,大于等于257的PyObject是通过_PyLong_New分配的,所以自然引用的不是同一块内存。

关于python对象引用

  1. python中变量和数据是分开存放的。
  2. python将所有数据存为内存对象,变量事实上是指内存对象的引用。”=”用于将变量名和内存中的某个对象绑定,如果对象事先存在,则进行绑定,否则,”=”会直接创建引用的对象。
  3. 动态类型,在任何时刻,只要需要某个对象引用,都可以重新引用一个不同的对象(可以是不同数据类型)。

注意:变量名没有类型,对象才有。