is
和==
都是对对象进行比较判断的操作符,但比较判断的内容并不相同。下面具体看看两者区别在哪?
Python设计之初就是一门面向对象的语言,即一切皆对象
Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)
技术上说,每个对象有两个标准的头部信息,一个类型标识符来标识类型,还有一个引用的计数器,用于决定是否需要回收对象
import sys
sys.getrefcount(1)
a = [1, 2, 3]
b = a
print(id(a)) # 140275598064704
print(id(b)) # 140275598064704
print(b is a) # True
print(b == a) # True
b = a[:]
print(id(a)) # 140275598064704
print(id(b)) # 140275598064832
print(b is a) # False
print(b == a) # True
a = 256
b = 128*2
print(a is b) # True
print(a == b) # True
a = 258
b = 129*2
print(a is b) # False
print(a == b) # True
int
_PyInt_Init(void)
{
PyIntObject *v;
int ival;
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
if (!free_list && (free_list = fill_free_list()) == NULL)
return 0;
/* PyObject_New is inlined */
v = free_list;
free_list = (PyIntObject *)Py_TYPE(v);
(void)PyObject_INIT(v, &PyInt_Type);
v->ob_ival = ival;
small_ints[ival + NSMALLNEGINTS] = v;
}
#endif
return 1;
}
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS 257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS 5
#endif
PyObject *
PyInt_FromLong(long ival)
{
register PyIntObject *v;
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
v = small_ints[ival + NSMALLNEGINTS];
Py_INCREF(v);
#ifdef COUNT_ALLOCS
if (ival >= 0)
quick_int_allocs++;
else
quick_neg_int_allocs++;
#endif
return (PyObject *) v;
}
#endif
if (free_list == NULL) {
if ((free_list = fill_free_list()) == NULL)
return NULL;
}
/* Inline PyObject_New */
v = free_list;
free_list = (PyIntObject *)Py_TYPE(v);
(void)PyObject_INIT(v, &PyInt_Type);
v->ob_ival = ival;
return (PyObject *) v;
}
int
_PyLong_Init(PyThreadState *tstate)
{
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) {
sdigit ival = (sdigit)i - NSMALLNEGINTS;
int size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1);
PyLongObject *v = _PyLong_New(1);
if (!v) {
return -1;
}
Py_SET_SIZE(v, size);
v->ob_digit[0] = (digit)abs(ival);
tstate->interp->small_ints[i] = v;
}
#endif
if (_Py_IsMainInterpreter(tstate)) {
_PyLong_Zero = PyLong_FromLong(0);
if (_PyLong_Zero == NULL) {
return 0;
}
_PyLong_One = PyLong_FromLong(1);
if (_PyLong_One == NULL) {
return 0;
}
/* initialize int_info */
if (Int_InfoType.tp_name == NULL) {
if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) {
return 0;
}
}
}
return 1;
}
NSMALLNEGINTS
和NSMALLPOSINTS
的定义,Objects/longobject.c,20行,具体代码如下:#define NSMALLPOSINTS _PY_NSMALLPOSINTS
#define NSMALLNEGINTS _PY_NSMALLNEGINTS
#define _PY_NSMALLPOSINTS 257
#define _PY_NSMALLNEGINTS 5
a = 'pythontab.com'
b = 'pythontab.com'
print(a is b) # False
print(a == b) # True
a = 'pythontabcom'
b = 'pythontabcom'
print(a is b) # True
print(a == b) # True
a = (1, 2, 3)
b = (1, 2, 3)
print(a is b) # False
print(a == b) # True
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b) # False
print(a == b) # True
a = {'python': 100, 'com': 1}
b = {'python': 100, 'com': 1}
print(a is b) # False
print(a == b) # True
a = set([1, 2, 3])
b = set([1, 2, 3])
print(a is b) # False
print(a == b) # True
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.