日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

CPython对象模型:整型

發(fā)布時(shí)間:2024/4/17 python 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CPython对象模型:整型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前一篇:CPython對象模型:基礎(chǔ)

程序中,最常用的數(shù)據(jù)類型之一就是整型了。 本篇博文記錄的就是研究整型過程中的一些心得。

1 PyLongObject

1.1 版本之別

在python2.x中,整型對象還有兩種:不太大的整數(shù)int(約等于C語言中l(wèi)ong)和大整數(shù)long。 在python3之后,這兩種類型合并為int,但新的int類型的表現(xiàn)和2.x中的long其實(shí)更為接近。

在python2.x中,int是一個(gè)定長的類型,并且采用了兩個(gè)不同的內(nèi)存池分別存放小整數(shù)和大整數(shù); 但在python3之后,int變成了變長對象, 且只有小整數(shù)還放在一個(gè)內(nèi)存池中,大整數(shù)并未采用此技術(shù)。(內(nèi)存池詳解見《python源碼剖析》2.2)

在開始后面的內(nèi)容之前再說明一下: 雖然python3中整型的類型名叫做int,可是它在源碼中的名字全都是PyLongXXX之類的, 找不到PyIntXXX是一件正常的事情。

本文涉及文件:

  • Include/longobject.h
  • Include/longintrepr.h
  • Objects/longobject.c

1.2 PyLongObject

表示整型對象的數(shù)據(jù)結(jié)構(gòu)是PyLongType,定義如下:

/* file:Include/longintrepr.h */struct _longobject {PyObject_VAR_HEAD /* 展開后為PyVarObject ob_base; */digit ob_digit[1];}; /* file:Include/longobject.h */typedef struct _longobject PyLongObject;

?

python有兩套數(shù)的表示法(也就是digit這個(gè)類型有兩種定義), 一個(gè)數(shù)用30個(gè)二進(jìn)制位來表示,存儲(chǔ)在unsigned int中, 另一個(gè)用15個(gè)二進(jìn)制位來表示,存儲(chǔ)在unsigned short中, 宏P(guān)YLONG_BITS_IN_DIGIT決定了使用哪個(gè)表示法(該宏定義在Include/pyport.h中或者在configure時(shí)設(shè)定)。 在后文中,你會(huì)發(fā)現(xiàn)關(guān)于這兩套不同表示的一些處理。

在PyLongObject的定義中,采用了一個(gè)digit類型的數(shù)組來存儲(chǔ)數(shù)。 對于那些需要多個(gè)digit來存儲(chǔ)的數(shù),可以通過數(shù)組越界的神奇方法(這里真是蠻拼的) 通過ob_digit來訪問,因?yàn)樵诜峙鋬?nèi)存時(shí)會(huì)根據(jù)數(shù)的大小在ob_digit后分配一些空余空間正好用來越界(真的蠻拼的= =)。

一個(gè)需要多個(gè)digit存儲(chǔ)的數(shù)是以什么樣的順序存儲(chǔ)的呢?請看后文詳解。

1.3 類型對象

基礎(chǔ)篇說過,每一個(gè)內(nèi)置類型都由一個(gè)對應(yīng)的PyTypeObject類型的變量用來保存這個(gè)類型相關(guān)的各種信息。 在整型中,這個(gè)家伙的定義如下:

/* file: Objects/longobject.c */PyTypeObject PyLong_Type = {PyVarObject_HEAD_INIT(&PyType_Type, 0)"int", /* tp_name */offsetof(PyLongObject, ob_digit), /* tp_basicsize */sizeof(digit), /* tp_itemsize */long_dealloc, /* tp_dealloc */0, /* tp_print */0, /* tp_getattr */0, /* tp_setattr */0, /* tp_reserved */long_to_decimal_string, /* tp_repr */&long_as_number, /* tp_as_number */0, /* tp_as_sequence */0, /* tp_as_mapping */(hashfunc)long_hash, /* tp_hash */0, /* tp_call */long_to_decimal_string, /* tp_str */PyObject_GenericGetAttr, /* tp_getattro */0, /* tp_setattro */0, /* tp_as_buffer */Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */long_doc, /* tp_doc */0, /* tp_traverse */0, /* tp_clear */long_richcompare, /* tp_richcompare */0, /* tp_weaklistoffset */0, /* tp_iter */0, /* tp_iternext */long_methods, /* tp_methods */0, /* tp_members */long_getset, /* tp_getset */0, /* tp_base */0, /* tp_dict */0, /* tp_descr_get */0, /* tp_descr_set */0, /* tp_dictoffset */0, /* tp_init */0, /* tp_alloc */long_new, /* tp_new */PyObject_Del, /* tp_free */};

關(guān)于類型對象中的各項(xiàng)的意思在此就略過不提了。

2 整型對象的創(chuàng)建

python中存在多個(gè)用來創(chuàng)建整型對象的函數(shù),但它們之間的差異并不大, 因此這里只分析一個(gè)典型的例子:PyLong_FromLong。

2.1 小整數(shù)對象池

由于整數(shù)(特別是小整數(shù))在程序中會(huì)被用到的次數(shù)太多, 因此如果每次使用整數(shù)都去分配內(nèi)存、使用后再釋放內(nèi)存就會(huì)使得效率極其低。 為了提高效率,python對于小整數(shù)使用了對象池技術(shù)。

python會(huì)事先劃定固定大小的內(nèi)存空間用來存儲(chǔ)小整數(shù)對象, 并且這些小整數(shù)對象一旦創(chuàng)建會(huì)一直持續(xù)到python進(jìn)程結(jié)束才被釋放。

這個(gè)對象池的定義如下:

/* file:Objects/longobject.c */ static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS];

NSMALLNEGINTS和NSMALLPOSINTS規(guī)定了小整數(shù)的范圍, 任意小整數(shù)x都滿足 -NSMALLNEGINTS ≤ x < NSMALLPOSINTS。

在python解釋器啟動(dòng)時(shí),會(huì)調(diào)用_PyLong_Init()函數(shù)進(jìn)行初始化, 初始化后small_ints數(shù)組內(nèi)的對象都會(huì)被初始化,之后使用只需要直接引用即可。

在創(chuàng)建整型對象時(shí),會(huì)執(zhí)行小整數(shù)檢查:

/* file:Objects/longobject.c */ static PyObject * get_small_int(sdigit ival) {PyObject *v;assert(-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS);v = (PyObject *)&small_ints[ival + NSMALLNEGINTS];Py_INCREF(v); /* 該對象引用數(shù)增加 */ #ifdef COUNT_ALLOCSif (ival >= 0)quick_int_allocs++;elsequick_neg_int_allocs++; #endifreturn v; } #define CHECK_SMALL_INT(ival) \do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \return get_small_int((sdigit)ival); \} while(0)

CHECK_SMALL_INT宏都在各種創(chuàng)建整數(shù)對象的函數(shù)內(nèi)被使用, 因此不要奇怪出現(xiàn)了return。 若需要?jiǎng)?chuàng)建的數(shù)在小整數(shù)范圍內(nèi), 就會(huì)調(diào)用get_small_int函數(shù)從對象池中尋找并返回對應(yīng)的對象。

2.2 其他整數(shù)

相比于小整數(shù),其他整數(shù)的創(chuàng)建就麻煩的多了。這里以PyLong_FromLong為例:

1 /* file:Objects/longobject.c */ 2 /* Create a new int object from a C long int */ 3 4 PyObject * 5 PyLong_FromLong(long ival) 6 { 7 PyLongObject *v; 8 unsigned long abs_ival; 9 unsigned long t; /* unsigned so >> doesn't propagate sign bit */ 10 int ndigits = 0; 11 int sign = 1; 12 13 CHECK_SMALL_INT(ival); 14 15 if (ival < 0) { 16 /* negate: can't write this as abs_ival = -ival since that 17 invokes undefined behaviour when ival is LONG_MIN */ 18 abs_ival = 0U-(unsigned long)ival; 19 sign = -1; 20 } 21 else { 22 abs_ival = (unsigned long)ival; 23 } 24 25 /* Fast path for single-digit ints */ 26 if (!(abs_ival >> PyLong_SHIFT)) { 27 v = _PyLong_New(1); 28 if (v) { 29 Py_SIZE(v) = sign; 30 v->ob_digit[0] = Py_SAFE_DOWNCAST( 31 abs_ival, unsigned long, digit); 32 } 33 return (PyObject*)v; 34 } 35 36 #if PyLong_SHIFT==15 37 /* 2 digits */ 38 if (!(abs_ival >> 2*PyLong_SHIFT)) { 39 v = _PyLong_New(2); 40 if (v) { 41 Py_SIZE(v) = 2*sign; 42 v->ob_digit[0] = Py_SAFE_DOWNCAST( 43 abs_ival & PyLong_MASK, unsigned long, digit); 44 v->ob_digit[1] = Py_SAFE_DOWNCAST( 45 abs_ival >> PyLong_SHIFT, unsigned long, digit); 46 } 47 return (PyObject*)v; 48 } 49 #endif 50 51 /* Larger numbers: loop to determine number of digits */ 52 t = abs_ival; 53 while (t) { 54 ++ndigits; 55 t >>= PyLong_SHIFT; 56 } 57 v = _PyLong_New(ndigits); 58 if (v != NULL) { 59 digit *p = v->ob_digit; 60 Py_SIZE(v) = ndigits*sign; 61 t = abs_ival; 62 while (t) { 63 *p++ = Py_SAFE_DOWNCAST( 64 t & PyLong_MASK, unsigned long, digit); 65 t >>= PyLong_SHIFT; 66 } 67 } 68 return (PyObject *)v; 69 } 70 71 PyLongObject * 72 _PyLong_New(Py_ssize_t size) 73 { 74 PyLongObject *result; 75 /* Number of bytes needed is: offsetof(PyLongObject, ob_digit) + 76 sizeof(digit)*size. Previous incarnations of this code used 77 sizeof(PyVarObject) instead of the offsetof, but this risks being 78 incorrect in the presence of padding between the PyVarObject header 79 and the digits. */ 80 if (size > (Py_ssize_t)MAX_LONG_DIGITS) { 81 PyErr_SetString(PyExc_OverflowError, 82 "too many digits in integer"); 83 return NULL; 84 } 85 result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) + 86 size*sizeof(digit)); 87 if (!result) { 88 PyErr_NoMemory(); 89 return NULL; 90 } 91 return (PyLongObject*)PyObject_INIT_VAR(result, &PyLong_Type, size); 92 }

調(diào)用該函數(shù)后,先用CHECK_SMALL_INT來檢查小整數(shù),這個(gè)在前面已經(jīng)分析過了。

若不是小整數(shù),首先需要求出ival的絕對值(15~23行)。 對于負(fù)數(shù),需要注意它求絕對值的方法:用0減而不是直接取反。 這是由于最小的long取反后會(huì)導(dǎo)致溢出。以64位long為例, 最小的long是-2^63,最大是2^63 - 1,取反后溢出可能發(fā)生神奇的事情。

在代碼的第25~33行,是針對一個(gè)digit能存儲(chǔ)的情況做的優(yōu)化。 調(diào)用_PyLong_New分配內(nèi)存后,設(shè)置v的大小和ob_digit值并返回即可。 用來設(shè)置值的Py_SAFE_DOWNCAST是一個(gè)宏,它的定義在非DEBUG模式下如下:

#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) /* 其實(shí)就是直接進(jìn)行類型轉(zhuǎn)換進(jìn)行截?cái)唷? 在DEBUG模式下會(huì)有更復(fù)雜的表現(xiàn)*/

在36~49行,是針對15位digit、兩個(gè)digit存儲(chǔ)的情況做的優(yōu)化。 在設(shè)置值時(shí),

ob_digit[0]中存放的是后15的值(PyLong_MASK的值是0x7FFF,與abs_ival做按位與得到后15位), ob_digit[1]中存放的自然是前15位了。

這里就可以解答上面提出的一個(gè)問題了,多個(gè)digit保存的情況下,到底是以怎樣的順序存放的呢? 答案就是,對于b位的digit,

ob_digit[n]中存放的是從低位起從零計(jì)數(shù)的第(n-1)*b到第n*b-1位。

在51~68行,是對于其他情況的一個(gè)普遍處理方法,這里就不詳細(xì)分析了。

需要注意的是,size會(huì)決定一個(gè)數(shù)的正負(fù)(因?yàn)閛b_digit存儲(chǔ)的都是絕對值后的結(jié)果)負(fù)數(shù)的話是digit數(shù)的相反數(shù),0的話是0,正數(shù)是digit數(shù)。

最后,再分析一下_PyLong_new這個(gè)函數(shù)。 這個(gè)函數(shù)中最關(guān)鍵的是計(jì)算該對象的大小。這里采用了如下計(jì)算方式:

對象大小 = ob_digit偏移量 + size*sizeof(digit)

再看看offsetof這個(gè)宏:

# define offsetof(type, member) ((size_t)(&((type *)0)->member))

以0為基地址取member的地址再轉(zhuǎn)換成size_t類型就是其偏移。

3 其他操作分析

最后,再看一個(gè)典型的操作來看看python是如何處理整型數(shù)據(jù)的。 這些操作在PyLong_Type的tp_as_number成員中可以看到。

3.1 加法

加法定義如下:

/* file:Objects/longobject.c */long_add(PyLongObject *a, PyLongObject *b) {PyLongObject *z;CHECK_BINOP(a, b);if (ABS(Py_SIZE(a)) <= 1 && ABS(Py_SIZE(b)) <= 1) {PyObject *result = PyLong_FromLong(MEDIUM_VALUE(a) +MEDIUM_VALUE(b));return result;}if (Py_SIZE(a) < 0) {if (Py_SIZE(b) < 0) {z = x_add(a, b);if (z != NULL && Py_SIZE(z) != 0)Py_SIZE(z) = -(Py_SIZE(z));}elsez = x_sub(b, a);}else {if (Py_SIZE(b) < 0)z = x_sub(a, b);elsez = x_add(a, b);}return (PyObject *)z; }

?

python中的整型是不可變對象,因此每一次運(yùn)算都會(huì)產(chǎn)生新的整型對象。 看到這里我們會(huì)自然的產(chǎn)生疑問,如果在python里重復(fù)計(jì)算兩個(gè)非小整數(shù)相加, 會(huì)不會(huì)一直產(chǎn)生新的對象呢?還是會(huì)引用到原先的對象呢? 從目前分析過的代碼中,我們可以猜測是會(huì)產(chǎn)生新的對象;后文會(huì)給出驗(yàn)證方法。

在上面的函數(shù)中,主要工作就是對size進(jìn)行判斷并調(diào)用對應(yīng)的函數(shù); 因此更核心的功能在x_add和x_sub中。這里只分析x_add:

1 /* file:Objects/longobject.c */ 2 static PyLongObject * 3 x_add(PyLongObject *a, PyLongObject *b) 4 { 5 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b)); 6 PyLongObject *z; 7 Py_ssize_t i; 8 digit carry = 0; 9 10 /* Ensure a is the larger of the two: */ 11 if (size_a < size_b) { 12 { PyLongObject *temp = a; a = b; b = temp; } 13 { Py_ssize_t size_temp = size_a; 14 size_a = size_b; 15 size_b = size_temp; } 16 } 17 z = _PyLong_New(size_a+1); 18 if (z == NULL) 19 return NULL; 20 for (i = 0; i < size_b; ++i) { 21 carry += a->ob_digit[i] + b->ob_digit[i]; 22 z->ob_digit[i] = carry & PyLong_MASK; 23 carry >>= PyLong_SHIFT; 24 } 25 for (; i < size_a; ++i) { 26 carry += a->ob_digit[i]; 27 z->ob_digit[i] = carry & PyLong_MASK; 28 carry >>= PyLong_SHIFT; 29 } 30 z->ob_digit[i] = carry; 31 return long_normalize(z); 32 }

首先,確保a是size較大的一個(gè)(10~15行)。

之后,為新的對象分配size_a+1的空間。

然后,對于ob_digit中每一個(gè)元素分別相加,所得結(jié)果與PyLong_MASK按位與再存入新對象對應(yīng)ob_digit中, 之后carry右移。這樣可以保證超出的部分不會(huì)丟失。 進(jìn)行完所有加法后,把carry放在新對象的對高ob_digit中以防丟失運(yùn)算中溢出的結(jié)果。 最后調(diào)用long_normalize消除前導(dǎo)零(防止size暴漲狂吃內(nèi)存)。

4 Hack it

這里我們主要打print的主意。 在python2.x中,print語句調(diào)用的是類型中的tp_print成員對應(yīng)的函數(shù); 可是python3之后刪除了print語句,print成了內(nèi)建函數(shù),這樣就變的稍微麻煩了一點(diǎn)。

查官網(wǎng)手冊可知,print函數(shù)會(huì)調(diào)用str函數(shù),str函數(shù)對應(yīng)類型中的tp_str。 因此,我們需要更改一下tp_str的內(nèi)容。

改動(dòng)之前,發(fā)現(xiàn)tp_repr和tp_str的內(nèi)容一樣。 由于tp_repr在python編譯中起到了很重要的作用,因此最好把它和tp_str分開。

把tp_str對應(yīng)的函數(shù)long_to_decimal_string復(fù)制粘貼并改個(gè)名字(比如my_long_to_decimal_string), 再把該函數(shù)內(nèi)調(diào)用的long_to_decimal_string_internal復(fù)制粘貼改名字,再把PyLong_Type對應(yīng)的tp_str改了, 就可以放心的下手啦。

PyTypeObject PyLong_Type = {/* ... */long_to_decimal_string, /* tp_repr *//* ... */my_long_to_decimal_string, /* tp_str *//* ... */ }

之后就是修改代碼了。在long_to_decimal_string_internal中,進(jìn)行輸出的部分是其中的WRITE_DIGITS宏, 這個(gè)宏會(huì)寫入內(nèi)容到之后打印的字符串內(nèi),而我們需要做的就是修改這個(gè)宏。除此之外,還需要修改以下和字符串長度相關(guān)的部分。

1 /* file:Objects/longobject.c */ 2 long_to_decimal_string_internal(PyObject *aa, 3 PyObject **p_output, 4 _PyUnicodeWriter *writer) 5 { 6 PyLongObject *scratch, *a; 7 PyObject *str; 8 Py_ssize_t size, strlen, size_a, i, j; 9 digit *pout, *pin, rem, tenpow; 10 int negative; 11 enum PyUnicode_Kind kind; 12 13 a = (PyLongObject *)aa; 14 if (a == NULL || !PyLong_Check(a)) { 15 PyErr_BadInternalCall(); 16 return -1; 17 } 18 size_a = ABS(Py_SIZE(a)); 19 negative = Py_SIZE(a) < 0; 20 21 /* quick and dirty upper bound for the number of digits 22 required to express a in base _PyLong_DECIMAL_BASE: 23 24 #digits = 1 + floor(log2(a) / log2(_PyLong_DECIMAL_BASE)) 25 26 But log2(a) < size_a * PyLong_SHIFT, and 27 log2(_PyLong_DECIMAL_BASE) = log2(10) * _PyLong_DECIMAL_SHIFT 28 > 3 * _PyLong_DECIMAL_SHIFT 29 */ 30 if (size_a > PY_SSIZE_T_MAX / PyLong_SHIFT) { 31 PyErr_SetString(PyExc_OverflowError, 32 "int too large to format"); 33 return -1; 34 } 35 /* the expression size_a * PyLong_SHIFT is now safe from overflow */ 36 size = 1 + size_a * PyLong_SHIFT / (3 * _PyLong_DECIMAL_SHIFT); 37 scratch = _PyLong_New(size); 38 if (scratch == NULL) 39 return -1; 40 41 /* convert array of base _PyLong_BASE digits in pin to an array of 42 base _PyLong_DECIMAL_BASE digits in pout, following Knuth (TAOCP, 43 Volume 2 (3rd edn), section 4.4, Method 1b). */ 44 pin = a->ob_digit; 45 pout = scratch->ob_digit; 46 size = 0; 47 for (i = size_a; --i >= 0; ) { 48 digit hi = pin[i]; 49 for (j = 0; j < size; j++) { 50 twodigits z = (twodigits)pout[j] << PyLong_SHIFT | hi; 51 hi = (digit)(z / _PyLong_DECIMAL_BASE); 52 pout[j] = (digit)(z - (twodigits)hi * 53 _PyLong_DECIMAL_BASE); 54 } 55 while (hi) { 56 pout[size++] = hi % _PyLong_DECIMAL_BASE; 57 hi /= _PyLong_DECIMAL_BASE; 58 } 59 /* check for keyboard interrupt */ 60 SIGCHECK({ 61 Py_DECREF(scratch); 62 return -1; 63 }); 64 } 65 /* pout should have at least one digit, so that the case when a = 0 66 works correctly */ 67 if (size == 0) 68 pout[size++] = 0; 69 70 /* calculate exact length of output string, and allocate */ 71 strlen = negative + 1 + (size - 1) * _PyLong_DECIMAL_SHIFT; 72 tenpow = 10; 73 rem = pout[size-1]; 74 while (rem >= tenpow) { 75 tenpow *= 10; 76 strlen++; 77 } 78 if (writer) { 79 if (_PyUnicodeWriter_Prepare(writer, strlen, '9') == -1) { 80 Py_DECREF(scratch); 81 return -1; 82 } 83 kind = writer->kind; 84 str = NULL; 85 } 86 else { 87 str = PyUnicode_New(strlen, '9'); 88 if (str == NULL) { 89 Py_DECREF(scratch); 90 return -1; 91 } 92 kind = PyUnicode_KIND(str); 93 } 94 95 #define WRITE_DIGITS(TYPE) \ 96 do { \ 97 if (writer) \ 98 p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + strlen; \ 99 else \ 100 p = (TYPE*)PyUnicode_DATA(str) + strlen; \ 101 \ 102 /* pout[0] through pout[size-2] contribute exactly \ 103 _PyLong_DECIMAL_SHIFT digits each */ \ 104 for (i=0; i < size - 1; i++) { \ 105 rem = pout[i]; \ 106 for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) { \ 107 *--p = '0' + rem % 10; \ 108 rem /= 10; \ 109 } \ 110 } \ 111 /* pout[size-1]: always produce at least one decimal digit */ \ 112 rem = pout[i]; \ 113 do { \ 114 *--p = '0' + rem % 10; \ 115 rem /= 10; \ 116 } while (rem != 0); \ 117 \ 118 /* and sign */ \ 119 if (negative) \ 120 *--p = '-'; \ 121 \ 122 /* check we've counted correctly */ \ 123 if (writer) \ 124 assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \ 125 else \ 126 assert(p == (TYPE*)PyUnicode_DATA(str)); \ 127 } while (0) 128 129 /* fill the string right-to-left */ 130 if (kind == PyUnicode_1BYTE_KIND) { 131 Py_UCS1 *p; 132 WRITE_DIGITS(Py_UCS1); 133 } 134 else if (kind == PyUnicode_2BYTE_KIND) { 135 Py_UCS2 *p; 136 WRITE_DIGITS(Py_UCS2); 137 } 138 else { 139 Py_UCS4 *p; 140 assert (kind == PyUnicode_4BYTE_KIND); 141 WRITE_DIGITS(Py_UCS4); 142 } 143 #undef WRITE_DIGITS 144 145 Py_DECREF(scratch); 146 if (writer) { 147 writer->pos += strlen; 148 } 149 else { 150 assert(_PyUnicode_CheckConsistency(str, 1)); 151 *p_output = (PyObject *)str; 152 } 153 return 0; 154 }

?

上面的代碼中,strlen這個(gè)變量表示了字符串的長度。

為了驗(yàn)證打印的對象是否是同一個(gè),我們用一個(gè)靜態(tài)變量保存上一次要打印的結(jié)果。 若是同一個(gè)對象,則打印出YES并換行;若不是同一個(gè)對象也打印NO并換行。 這樣的改法最多會(huì)增加4個(gè)長度,因此給strlen+4。

在WRITE_DIGITS宏內(nèi)會(huì)倒序排列要輸出的內(nèi)容,因此我們也得倒著加要打印的東西。 在121行后面加入下列代碼:

*--p = '\n'; \ if(pre == aa)\ {\*--p = 'S'; \*--p = 'E'; \*--p = 'Y'; \ }\ else\ {\*--p = ' '; \*--p = 'O'; \*--p = 'N'; \ }\

編譯python并運(yùn)行,測試一下print函數(shù):

>>> print(1) NO 1 >>> print(1) YES 1 >>> print(400 + 300) NO 700 >>> print(400 + 300) NO 700 >>> print(700) NO 700 >>> print(700) YES 700 >>> a = 600 + 900 >>> b = 600 + 900 >>> print(a) NO 1500
>>> print(a) YES 1500
>>> print(b)
NO
1500
>>> print(600 + 900)
NO
1500

運(yùn)行結(jié)果確實(shí)如猜想那樣,每次加都會(huì)產(chǎn)生值一樣的全新對象。

最后放上更改后的long_to_decimal_string系列函數(shù):

1 static int 2 my_long_to_decimal_string_internal(PyObject *aa, 3 PyObject **p_output, 4 _PyUnicodeWriter *writer) 5 { 6 PyLongObject *scratch, *a; 7 PyObject *str; 8 Py_ssize_t size, strlen, size_a, i, j, tmp; 9 digit *pout, *pin, rem, tenpow; 10 int negative; 11 enum PyUnicode_Kind kind; 12 static PyObject *pre = NULL; 13 14 a = (PyLongObject *)aa; 15 if (a == NULL || !PyLong_Check(a)) { 16 PyErr_BadInternalCall(); 17 return -1; 18 } 19 size_a = ABS(Py_SIZE(a)); 20 negative = Py_SIZE(a) < 0; 21 22 /* quick and dirty upper bound for the number of digits 23 required to express a in base _PyLong_DECIMAL_BASE: 24 25 #digits = 1 + floor(log2(a) / log2(_PyLong_DECIMAL_BASE)) 26 27 But log2(a) < size_a * PyLong_SHIFT, and 28 log2(_PyLong_DECIMAL_BASE) = log2(10) * _PyLong_DECIMAL_SHIFT 29 > 3 * _PyLong_DECIMAL_SHIFT 30 */ 31 if (size_a > PY_SSIZE_T_MAX / PyLong_SHIFT) { 32 PyErr_SetString(PyExc_OverflowError, 33 "int too large to format"); 34 return -1; 35 } 36 /* the expression size_a * PyLong_SHIFT is now safe from overflow */ 37 size = 1 + size_a * PyLong_SHIFT / (3 * _PyLong_DECIMAL_SHIFT); 38 scratch = _PyLong_New(size); 39 if (scratch == NULL) 40 return -1; 41 42 /* convert array of base _PyLong_BASE digits in pin to an array of 43 base _PyLong_DECIMAL_BASE digits in pout, following Knuth (TAOCP, 44 Volume 2 (3rd edn), section 4.4, Method 1b). */ 45 pin = a->ob_digit; 46 pout = scratch->ob_digit; 47 size = 0; 48 for (i = size_a; --i >= 0; ) { 49 digit hi = pin[i]; 50 for (j = 0; j < size; j++) { 51 twodigits z = (twodigits)pout[j] << PyLong_SHIFT | hi; 52 hi = (digit)(z / _PyLong_DECIMAL_BASE); 53 pout[j] = (digit)(z - (twodigits)hi * 54 _PyLong_DECIMAL_BASE); 55 } 56 while (hi) { 57 pout[size++] = hi % _PyLong_DECIMAL_BASE; 58 hi /= _PyLong_DECIMAL_BASE; 59 } 60 /* check for keyboard interrupt */ 61 SIGCHECK({ 62 Py_DECREF(scratch); 63 return -1; 64 }); 65 } 66 /* pout should have at least one digit, so that the case when a = 0 67 works correctly */ 68 if (size == 0) 69 pout[size++] = 0; 70 71 /* calculate exact length of output string, and allocate */ 72 strlen = negative + 1 + (size - 1) * _PyLong_DECIMAL_SHIFT + 4; 73 tenpow = 10; 74 rem = pout[size-1]; 75 while (rem >= tenpow) { 76 tenpow *= 10; 77 strlen++; 78 } 79 if (writer) { 80 if (_PyUnicodeWriter_Prepare(writer, strlen, '9') == -1) { 81 Py_DECREF(scratch); 82 return -1; 83 } 84 kind = writer->kind; 85 str = NULL; 86 } 87 else { 88 str = PyUnicode_New(strlen, '9'); 89 if (str == NULL) { 90 Py_DECREF(scratch); 91 return -1; 92 } 93 kind = PyUnicode_KIND(str); 94 } 95 tmp = Py_SIZE(a); 96 97 #define WRITE_DIGITS(TYPE) \ 98 do { \ 99 if (writer) \ 100 p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + strlen; \ 101 else \ 102 p = (TYPE*)PyUnicode_DATA(str) + strlen; \ 103 \ 104 /* pout[0] through pout[size-2] contribute exactly \ 105 _PyLong_DECIMAL_SHIFT digits each */ \ 106 for (i=0; i < size - 1; i++) { \ 107 rem = pout[i]; \ 108 for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) { \ 109 *--p = '0' + rem % 10; \ 110 rem /= 10; \ 111 } \ 112 } \ 113 /* pout[size-1]: always produce at least one decimal digit */ \ 114 rem = pout[i]; \ 115 do { \ 116 *--p = '0' + rem % 10; \ 117 rem /= 10; \ 118 } while (rem != 0); \ 119 \ 120 /* and sign */ \ 121 if (negative) \ 122 *--p = '-'; \ 123 *--p = '\n'; \ 124 if(pre == aa)\ 125 {\ 126 *--p = 'S'; \ 127 *--p = 'E'; \ 128 *--p = 'Y'; \ 129 }\ 130 else\ 131 {\ 132 *--p = ' '; \ 133 *--p = 'O'; \ 134 *--p = 'N'; \ 135 }\ 136 \ 137 /* check we've counted correctly */ \ 138 if (writer) \ 139 assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \ 140 else \ 141 assert(p == (TYPE*)PyUnicode_DATA(str)); \ 142 } while (0) 143 144 /* fill the string right-to-left */ 145 if (kind == PyUnicode_1BYTE_KIND) { 146 Py_UCS1 *p; 147 WRITE_DIGITS(Py_UCS1); 148 } 149 else if (kind == PyUnicode_2BYTE_KIND) { 150 Py_UCS2 *p; 151 WRITE_DIGITS(Py_UCS2); 152 } 153 else { 154 Py_UCS4 *p; 155 assert (kind == PyUnicode_4BYTE_KIND); 156 WRITE_DIGITS(Py_UCS4); 157 } 158 #undef WRITE_DIGITS 159 160 Py_DECREF(scratch); 161 if (writer) { 162 writer->pos += strlen; 163 } 164 else { 165 assert(_PyUnicode_CheckConsistency(str, 1)); 166 *p_output = (PyObject *)str; 167 } 168 pre = aa; 169 return 0; 170 } 171 172 static PyObject * 173 my_long_to_decimal_string(PyObject *aa) 174 { 175 PyObject *v; 176 if (my_long_to_decimal_string_internal(aa, &v, NULL) == -1) 177 return NULL; 178 return v; 179 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/w0mTea/p/4287264.html

總結(jié)

以上是生活随笔為你收集整理的CPython对象模型:整型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久黄色网页 | 精品av在线播放 | 人人爽人人片 | 91视频高清| 激情小说网站亚洲综合网 | 久久99精品一区二区三区三区 | 91视频在线网址 | 欧美,日韩 | 999精品| 亚洲影音先锋 | 色婷婷六月| 国产午夜精品免费一区二区三区视频 | 99欧美视频| 日韩欧美视频免费观看 | aⅴ视频在线 | 久久久久久久久爱 | 欧美久久久久久久久久 | 久久图| 深夜福利视频在线观看 | 中文字幕久久精品 | 国产在线小视频 | 一区二区三区精品在线视频 | 亚洲最新视频在线播放 | 国产一区二区在线免费播放 | 69久久久| 欧美专区日韩专区 | 日韩黄视频 | 国产69精品久久久久久 | 在线你懂 | 五月激情天 | 亚洲国产免费网站 | 99精品久久久久久久久久综合 | 最新的av网站 | 天天激情综合 | 亚洲激情 欧美激情 | 久久不射电影院 | 天天草夜夜| 97超级碰碰 | 欧美少妇影院 | 国产精品区免费视频 | 久久久www成人免费毛片 | 亚洲精品乱码久久久久久写真 | 在线观看中文av | 美女精品久久久 | 一区二区三区福利 | 亚洲精品免费播放 | 人人干狠狠操 | 波多野结衣电影一区 | 91亚洲狠狠婷婷综合久久久 | 视频91在线| 中文国产在线观看 | 欧美日韩国产精品久久 | 免费高清在线观看成人 | 嫩草伊人久久精品少妇av | 亚洲欧美日韩一二三区 | 丁香六月色 | 中文字幕一二三区 | 国产在线播放观看 | 精品一区二区三区久久 | 久久久久久久99精品免费观看 | 丁香六月网| 亚洲爽爽网 | 久久精品久久久久 | 干亚洲少妇 | 国产精品99久久久久久有的能看 | 美女黄频在线观看 | 丝袜精品视频 | 乱男乱女www7788 | 午夜精品电影一区二区在线 | 亚洲国产成人av网 | 天天射天天舔天天干 | 成人黄色电影在线 | 亚洲一区二区三区91 | 99久久精品费精品 | 色综合久久精品 | 91成人免费看 | 91尤物国产尤物福利在线播放 | 国产成人综合图片 | 91在线视频在线观看 | av中文在线影视 | 国产99久久 | 国产在线观看免费av | 久操视频在线播放 | 成人超碰97 | 婷婷色5月 | 久久99最新地址 | 日韩美女黄色片 | 2019天天干夜夜操 | 91丨九色丨国产在线观看 | 伊人狠狠操 | 日韩免费在线观看视频 | 国产一级淫片免费看 | 亚洲国产午夜 | 探花视频在线版播放免费观看 | 久久精品高清视频 | www.91成人 | 国产一二区免费视频 | 欧美日本一二三 | 中文字幕日本在线观看 | 欧美视频在线观看免费网址 | 狠狠色丁香久久婷婷综合五月 | 国产综合激情 | 久久69精品久久久久久久电影好 | 欧美xxxxx在线视频 | 亚洲国产精品激情在线观看 | 亚洲v欧美v国产v在线观看 | 成人黄色小说在线观看 | 中文字幕在线观看一区 | 午夜久久精品 | 国内精品久久久久久久久久久 | 国产成人精品aaa | 96久久精品| 国产手机av| 黄色大片视频网站 | 国产精品国产三级国产不产一地 | 国产97在线视频 | 免费日韩一区二区三区 | 国内精品久久久久影院男同志 | 国产成人精品午夜在线播放 | 九九免费精品 | av一区二区在线观看中文字幕 | 久久中文字幕在线视频 | 天堂在线v| 亚洲精品久久久久999中文字幕 | 探花国产在线 | 丁香激情五月婷婷 | 99国产在线观看 | 久久天天躁夜夜躁狠狠躁2022 | 久草视频在线免费播放 | 成年人免费看的视频 | 中日韩三级视频 | 国产精品午夜久久久久久99热 | 国产亚洲精品久久久久秋 | 成人综合免费 | 蜜臀av夜夜澡人人爽人人 | 亚洲成色777777在线观看影院 | 久久久久久麻豆 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 免费成人在线网站 | 在线视频一区观看 | 国产精品女同一区二区三区久久夜 | 99热在线国产精品 | 狠狠色丁香九九婷婷综合五月 | 99久久婷婷国产一区二区三区 | 色视频在线观看 | 午夜视频在线观看一区二区三区 | 久久亚洲影视 | 黄色aaa级片 | 日韩有码在线播放 | 九九精品在线观看 | 日韩伦理片hd | 日本高清dvd | 久久国产网 | 亚洲午夜av久久乱码 | 国产精品乱码一区二三区 | 黄网站污| 欧美一区成人 | 精品视频免费观看 | 一区二区av | 最近更新中文字幕 | 日韩特黄av | 亚洲成人午夜在线 | 久热免费在线观看 | 亚洲成av人电影 | 日韩成人免费在线电影 | 六月丁香六月婷婷 | 久久久久欧美精品 | 一级α片免费看 | 91精品国产91久久久久久三级 | 国产成人精品久久亚洲高清不卡 | 久久久不卡影院 | 日日干日日操 | 三级av在线| 久久伊99综合婷婷久久伊 | 97在线看| 久久综合九色九九 | 日本三级久久 | 黄色成年片| 最新色视频 | www.亚洲| 免费久草视频 | 色偷偷人人澡久久超碰69 | ww视频在线观看 | 狠狠色丁香久久婷婷综合丁香 | 国产69精品久久久久9999apgf | 精品播放 | 国内少妇自拍视频一区 | 国产成人精品久 | 欧美日一级片 | 久久久激情网 | 日日日操 | 日韩最新av| 日韩网| 18pao国产成视频永久免费 | 午夜精品久久久久久久99热影院 | 免费在线观看91 | 在线视频 国产 日韩 | 最近中文字幕免费视频 | 五月婷婷综合激情 | 日韩精品中文字幕在线播放 | 久久99最新地址 | 久久国产精品99久久久久久老狼 | 人人爽人人爽人人片av免 | a黄在线观看 | 国产录像在线观看 | 国产成人在线看 | 国产精品福利av | 日本久久久久 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 久草视频在线看 | ,久久福利影视 | 日韩精品中文字幕在线不卡尤物 | 欧美久久久久久久久久 | 亚洲五月| sm免费xx网站 | 97影视| 亚洲精品高清视频 | 中文字幕中文字幕中文字幕 | 国色天香永久免费 | 久久超碰97| 久久免费久久 | 亚洲国产wwwccc36天堂 | 国产一区国产二区在线观看 | 久艹视频在线免费观看 | 97av视频 | 国产精品系列在线 | 色资源网免费观看视频 | 天天看天天干天天操 | 国产黄色在线 | 91经典在线 | 一级免费黄色 | 中文字幕精品视频 | 日韩欧美在线影院 | 国产精品二区在线观看 | 日本精品久久久久久 | 免费成人黄色 | 亚洲国产精品人久久电影 | 91插插插免费视频 | 国产精品门事件 | 免费看一及片 | 黄色不卡av| 国产麻豆视频免费观看 | 欧洲精品久久久久毛片完整版 | 精品国产一区二区三区久久久蜜臀 | 成人av网站在线播放 | 国产69精品久久app免费版 | 成人av网址大全 | 国产精品男女视频 | 婷婷激情综合网 | 中文国产在线观看 | 亚洲成a人片在线www | 久久99久久99精品免观看软件 | 黄色的视频网站 | 伊人天天 | 成人在线观看网址 | 欧美一区二区在线免费观看 | 久久a国产 | 日韩欧美在线免费观看 | 在线观看免费视频 | 久久综合狠狠综合久久狠狠色综合 | 欧美午夜精品久久久久 | 精品久久久久久久久久久久久 | 色婷婷狠狠五月综合天色拍 | 国产美女视频免费观看的网站 | 日韩av影片在线观看 | 超碰97国产| 久久情网 | 天天操夜夜操天天射 | 久久久久久久毛片 | 国偷自产视频一区二区久 | 人人揉人人揉人人揉人人揉97 | 一区二区观看 | 国产精品久久久久永久免费 | 黄色a视频 | 黄色一级在线免费观看 | 亚洲精品男人天堂 | 欧美91片| 国产小视频在线观看 | 亚洲天堂视频在线 | 中文字幕一区二区三区久久蜜桃 | 麻豆成人在线观看 | www黄在线 | 国产午夜激情视频 | 日产av在线播放 | 伊人天天狠天天添日日拍 | 亚洲精品视频在线免费播放 | 精品免费久久 | 久久久久久国产精品久久 | 国产 色| 亚洲精品www久久久久久 | 九九热在线免费观看 | 黄视频色网站 | 日韩成人av在线 | 国产激情免费 | 日日操天天射 | 17婷婷久久www | 97超碰中文字幕 | 日日夜夜天天操 | 99久久精品一区二区成人 | av电影中文 | 水蜜桃亚洲一二三四在线 | 成人av高清在线观看 | 国产主播大尺度精品福利免费 | av7777777| 日日操网站 | 日韩精品一区二区三区免费视频观看 | 日日夜色| 视频在线观看入口黄最新永久免费国产 | 成人av一区二区三区 | 免费在线激情视频 | 国产女人18毛片水真多18精品 | 亚洲 欧美日韩 国产 中文 | 四虎在线永久免费观看 | www.色婷婷.com| 丁香婷婷基地 | 国产又粗又猛又爽又黄的视频免费 | 黄色大全在线观看 | av福利免费 | 国产日韩欧美视频在线观看 | 66av99精品福利视频在线 | 亚洲精品456在线播放第一页 | 国产日韩一区在线 | 色偷偷网站视频 | 国产精品日韩精品 | 久久久免费观看视频 | 韩国av一区二区三区 | 天天干天天操av | 黄色av免费 | 亚洲欧美日韩精品一区二区 | 日本三级不卡视频 | 99视频+国产日韩欧美 | 处女av在线 | 精品视频久久久 | 久久综合久色欧美综合狠狠 | 国产字幕在线看 | 亚洲天堂网在线视频观看 | 在线视频 国产 日韩 | 狠狠久久 | 日韩在线观看一区二区 | 国产精品二区三区 | 久久久久久综合 | 国产乱老熟视频网88av | 亚洲欧洲xxxx | 久久超| 综合激情av | 亚洲a资源 | 97超碰人人爱 | 在线播放 日韩专区 | 欧美国产日韩激情 | 亚洲人成免费 | 久久爱www. | 日韩在线观看影院 | 丁香高清视频在线看看 | 欧美专区国产专区 | 亚洲最快最全在线视频 | 国产精品久久久久永久免费 | 91cn国产在线 | 久久在线影院 | 天天射天天 | 日韩精品久久久久久久电影99爱 | av在线亚洲天堂 | 在线视频 国产 日韩 | 婷婷丁香九月 | 四虎在线观看视频 | 亚洲欧美视频在线播放 | 国产成a人亚洲精v品在线观看 | 色的网站在线观看 | 精品国产一区二区三区久久久蜜臀 | 99久久久久久国产精品 | 欧美精品一区二区免费 | 99视频在线看 | 国产高清综合 | 欧美在线18| 亚洲精品久| 成人在线观看免费 | 色欧美日韩 | 国产精品密入口果冻 | 不卡的av | 国产免费人人看 | 亚洲专区视频在线观看 | 国产香蕉视频 | 奇米777777| 2018亚洲男人天堂 | 久久女同性恋中文字幕 | 亚洲精品中文在线 | 91综合久久一区二区 | adn—256中文在线观看 | 91视视频在线直接观看在线看网页在线看 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 国产精品理论片在线观看 | 亚洲人成人在线 | 五月婷婷开心中文字幕 | 久草在线综合网 | 亚洲情影院 | 麻豆一精品传二传媒短视频 | 91视频在线播放视频 | 国产香蕉97碰碰碰视频在线观看 | 欧美日韩精 | 夜色在线资源 | 精品在线不卡 | 国产成人61精品免费看片 | 在线免费观看麻豆 | 天天色欧美 | 日韩在线免费观看视频 | 开心丁香婷婷深爱五月 | 五月婷婷丁香网 | 免费色视频网站 | 久久九九影院 | 亚洲精选99 | 日韩a级免费视频 | 国产精品国产三级在线专区 | 久久中文字幕视频 | 国产精品综合在线观看 | 天天操夜夜曰 | 亚洲精品美女久久久久网站 | 国产精品麻豆三级一区视频 | 99理论片| 久久视频网址 | 久久久高清一区二区三区 | www黄色com | 国产视频一区二区在线播放 | 免费观看久久 | 这里只有精品视频在线观看 | 国内精品视频在线播放 | 欧美日韩免费视频 | 激情欧美一区二区三区 | 91污污视频在线观看 | 久久久久成人精品 | 日本高清xxxx | 一区二区三区四区五区在线视频 | 国产不卡av在线 | 色婷婷综合久久久 | 国产精品免费看久久久8精臀av | 69精品在线观看 | 性色av免费在线观看 | 久久久久久久久久久免费 | 国产精品免费看久久久8精臀av | 日韩综合一区二区三区 | 999亚洲国产996395 | 91网免费看 | 日韩欧美电影在线 | 99人成在线观看视频 | 欧美日韩一级久久久久久免费看 | 免费91在线 | 麻豆小视频在线观看 | 99久e精品热线免费 99国产精品久久久久久久久久 | 色99在线 | 91精品啪在线观看国产81旧版 | 亚洲欧美乱综合图片区小说区 | 超碰97.com | 亚洲精品国产精品久久99热 | 亚洲一级在线观看 | 国产精品99久久久 | 国产a级精品 | 狠狠干网 | 麻豆一区在线观看 | 人人爱人人爽 | 亚洲色图27p | 日本午夜免费福利视频 | 久久99久| 精品国产电影 | 亚洲欧美怡红院 | 97在线视频免费播放 | 国产麻豆精品免费视频 | 高清视频一区二区三区 | 精品久久精品 | 在线观看片 | 97碰碰精品嫩模在线播放 | 97精品国自产拍在线观看 | 国产精品激情偷乱一区二区∴ | 永久免费观看视频 | 99久久久久久久 | 午夜三级理论 | 视频福利在线观看 | 婷婷av资源 | 国产亚洲无 | 久久99亚洲精品久久久久 | 国产高清视频色在线www | 蜜臀久久99精品久久久久久网站 | 日韩欧美网址 | 久久国产露脸精品国产 | 涩涩网站在线播放 | 久久久久成人精品 | 欧美了一区在线观看 | 久久少妇免费视频 | 伊人久久婷婷 | 午夜久久久久 | 久久久免费看片 | www.夜夜干.com | 久久久亚洲影院 | 日韩在线二区 | 中文字幕在线播出 | 成人午夜电影免费在线观看 | 日韩天天操 | 亚洲精品在线视频 | 久久久久久久影视 | 国内精品久久久久久久久 | 97电影在线观看 | 日韩videos高潮hd | www欧美xxxx| 国产中文视 | 国产一区二区三区网站 | 久草电影在线观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 欧美日韩p片 | 99精彩视频在线观看免费 | 91av影视| 日韩mv欧美mv国产精品 | 狠狠狠色丁香婷婷综合激情 | 欧美成人xxx| 欧美一级免费 | 欧美大片在线看免费观看 | 欧美一区免费在线观看 | 欧美日韩二区三区 | 国产在线播放一区二区三区 | 成人视屏免费看 | 色婷婷一区 | 中文字幕在线观看一区 | 日韩欧美观看 | 四虎国产永久在线精品 | 欧美性色综合网站 | 国产精品夜夜夜一区二区三区尤 | 日韩久久精品一区二区三区下载 | 精品国产一区二区三区久久久蜜臀 | 日韩一二三区不卡 | 久久久久国产a免费观看rela | 黄色一级片视频 | 国产成人香蕉 | 在线 影视 一区 | 国产在线观看网站 | 人人干在线观看 | 精品国产乱码久久久久久浪潮 | 亚洲综合欧美日韩狠狠色 | av福利在线看 | 91视频免费看 | 超级碰碰碰免费视频 | 久久久国产精品网站 | 日韩在线三级 | 国产精品中文久久久久久久 | 日韩欧美在线免费观看 | 国产在线视频资源 | av视屏在线播放 | 黄色毛片电影 | 国产一区二区成人 | 99精品在线免费 | 日日夜夜精品免费视频 | 久久激情影院 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 99精品久久精品一区二区 | 国产精品一区二区在线观看免费 | 久久精品精品电影网 | 97免费视频在线 | 色多多污污在线观看 | 国产一区电影在线观看 | 五月综合色婷婷 | 日韩av网址在线 | 国产伦理精品一区二区 | 国产精品久久久久久麻豆一区 | 一区二区三区在线视频111 | 久草免费电影 | 久久免费在线视频 | 午夜丁香视频在线观看 | 成年人毛片在线观看 | 免费看久久 | 久久视频精品在线观看 | 中文字幕人成乱码在线观看 | 天天草天天摸 | 97国产精品亚洲精品 | 精品国产一区二区三区在线 | 欧美日韩一区二区三区在线观看视频 | 久久国产午夜精品理论片最新版本 | 免费h在线观看 | 免费久久网 | 丁香 久久 综合 | 97国产精品免费 | 麻豆视频在线免费看 | 亚洲成a人片综合在线 | 安徽妇搡bbbb搡bbbb | 国产精品无av码在线观看 | 视频成人永久免费视频 | 成人禁用看黄a在线 | 成人av在线直播 | 99精品国产在热久久下载 | 欧美激情精品久久久久久免费 | 国产黄色片免费看 | 欧美精品乱码久久久久久按摩 | 成人免费影院 | 2019免费中文字幕 | 人人澡澡人人 | 五月天婷亚洲天综合网精品偷 | 亚洲欧洲成人 | av资源免费在线观看 | 国产精品女同一区二区三区久久夜 | 在线观看你懂的网址 | 婷婷综合久久 | 国产一区二区精品91 | 91精品国产一区二区三区 | 午夜精品99久久免费 | 天天做日日爱夜夜爽 | 国产一区二区网址 | 久久精品中文字幕免费mv | 奇米网8888| 国产精品女主播一区二区三区 | 久久久久久久久久网站 | 国产老熟| 中文字幕国产一区 | 亚洲人成人99网站 | 摸bbb搡bbb搡bbbb | 四虎永久国产精品 | 亚洲黄色在线观看 | 成人毛片久久 | 婷婷伊人五月 | 色狠狠久久av五月综合 | 日韩大陆欧美高清视频区 | 欧美综合在线视频 | 在线日韩亚洲 | 久久精品久久久久电影 | 免费视频a| 欧美日韩不卡在线观看 | 亚洲精品色婷婷 | 在线免费视频 你懂得 | 欧美性色19p | 九草在线观看 | 欧美日韩免费在线视频 | 91麻豆精品国产自产在线 | 日韩一区二区三区高清在线观看 | 天天干天天拍天天操天天拍 | 国产精品久久久久aaaa九色 | 97色噜噜 | 在线亚洲午夜片av大片 | 免费a网| 久在线观看 | 91九色视频观看 | 麻豆国产精品永久免费视频 | 欧美日韩中文字幕视频 | 丁香视频| 人人插人人看 | 亚洲精品国产第一综合99久久 | 久久久久免费精品国产 | 国产精品18毛片一区二区 | 992tv人人网tv亚洲精品 | av天天干| 日韩特黄av | 九九av| 久久国产午夜精品理论片最新版本 | 精品视频区 | 高清不卡免费视频 | 在线免费观看的av网站 | 最近av在线 | 欧美网址在线观看 | 国产色在线观看 | 欧美午夜a| 欧美成人区 | 91在线视频在线 | 免费在线观看不卡av | 91视频免费网址 | 国产黄色免费在线观看 | 中文字幕免费国产精品 | 国产一级精品绿帽视频 | 日韩在线观 | 色在线最新 | 激情久久小说 | 日本中文字幕高清 | 一性一交视频 | 亚洲第一伊人 | 六月丁香色婷婷 | 中文字幕电影高清在线观看 | 高清av中文在线字幕观看1 | 91精品久 | 成人免费在线观看入口 | 九月婷婷人人澡人人添人人爽 | 国产一二区在线观看 | 亚洲第一伊人 | 国产日韩精品欧美 | 开心激情久久 | 久久久久久久久久久久电影 | 亚洲一区在线看 | 黄色一级大片在线免费看国产一 | 日本天天操| 色噜噜在线观看视频 | 69国产盗摄一区二区三区五区 | 久久99久久99精品免观看软件 | 亚洲精品久久久久久中文传媒 | av一区二区在线观看中文字幕 | 午夜精品福利一区二区三区蜜桃 | 操操日 | 欧美日韩免费一区 | 久久久伦理 | 久久综合之合合综合久久 | 国产一级h | 夜夜干夜夜 | 国产精品原创 | 在线一二三四区 | 国产高清99 | 在线观看日韩一区 | 在线免费黄色av | 日韩色区 | 色婷婷五| 免费成人黄色 | 日韩免费看的电影 | av资源网在线播放 | 久久久久中文 | 色诱亚洲精品久久久久久 | 韩日色视频 | 中文字幕av免费观看 | 在线日韩精品视频 | 亚洲黄色网络 | 91人人视频在线观看 | 国产在线观看av | 日韩国产精品一区 | 欧美在线视频a | 亚洲精品视频在线观看视频 | 国产视频 久久久 | 日韩精品播放 | 国产无吗一区二区三区在线欢 | 日韩免费福利 | 国内外成人免费在线视频 | 丝袜制服天堂 | 亚洲黄色成人网 | 欧美一级免费片 | 免费看黄色小说的网站 | 国产一区二区三区免费在线观看 | 欧美韩日在线 | 亚洲三级在线 | 亚洲国产片色 | 欧美一级性生活视频 | 国产69久久久欧美一级 | 亚洲精品视频在线观看网站 | 欧美日韩精品在线播放 | 国产91在线免费视频 | 天堂在线成人 | 午夜性生活 | 樱空桃av | 国产精品久久久久久久久久直播 | 日韩欧美高清一区二区 | 欧美色婷婷| 久久视频精品在线观看 | 亚洲婷婷网| 在线91视频 | 久草视频免费 | 国产三级久久久 | 久久综合久久综合久久综合 | 丝袜美腿在线 | 五月婷婷播播 | 国产群p视频 | 天堂中文在线视频 | 久久视频二区 | 97免费在线观看视频 | 在线观看 国产 | 在线观看一级视频 | 69久久夜色精品国产69 | 国产香蕉97碰碰碰视频在线观看 | 日韩毛片在线播放 | 亚洲国产日韩在线 | 黄色国产高清 | 天堂av在线7 | 久久国产综合视频 | 日韩夜夜爽| 国产九九九精品视频 | 日韩精品三区四区 | 久久伊人婷婷 | 日韩免费在线观看 | 99理论片 | 久久五月婷婷丁香社区 | 欧美日韩亚洲在线观看 | 国产精品久久久久久麻豆一区 | 成人xxxx | 国产日韩在线观看一区 | 天天操导航 | 91粉色视频 | 色天天综合久久久久综合片 | 国产不卡免费视频 | 九九导航| 奇米影视四色8888 | 久久国产亚洲精品 | 黄色成人在线网站 | 久章操| 婷香五月 | 亚洲影院国产 | 草久久久久久久 | 丁香综合网 | 亚洲精品视频中文字幕 | 国产精品丝袜 | 2017狠狠干| 99精品视频99 | aⅴ精品av导航 | 国产福利精品一区二区 | 日韩免费视频一区二区 | 视频一区二区免费 | 美女视频黄的免费的 | 99热国内精品 | 玖玖视频网 | 国产在线a不卡 | 中文在线字幕免费观 | 国产成人福利在线观看 | 亚洲成a人片在线观看网站口工 | 成人黄色大片在线观看 | 黄色亚洲 | 麻豆成人精品 | 亚洲自拍偷拍色图 | 久久综合欧美精品亚洲一区 | 在线黄色国产电影 | 欧美一区二区三区不卡 | 午夜视频免费播放 | 国产视频精品久久 | 亚洲有 在线 | 又黄又爽免费视频 | 在线亚洲午夜片av大片 | 日日夜夜网| 亚洲精品乱码久久久久久蜜桃91 | 久久久久黄色 | 国产视频不卡 | 国产97在线播放 | 国产免费视频一区二区裸体 | 天天舔天天射天天操 | 永久av免费在线观看 | 亚洲丝袜中文 | 亚洲天堂精品视频 | 999久久久久 | 亚洲国产电影在线观看 | 久久天天躁狠狠躁夜夜不卡公司 | 973理论片235影院9 | 91视频 - 88av| 色综合色综合色综合 | av电影免费观看 | 国产小视频在线观看 | 免费国产一区二区 | 日韩欧美一区二区三区在线观看 | 国产精品视频久久久 | 日日爱影视 | 青春草免费在线视频 | 91亚洲精品久久久蜜桃 | 亚洲综合国产精品 | 最近2019中文免费高清视频观看www99 | 久草热视频 | 免费男女羞羞的视频网站中文字幕 | av不卡免费看 | 久草国产在线观看 | 久草在线免费色站 | 天天操天天干天天操天天干 | 欧美91片 | 久久成人亚洲欧美电影 | 中午字幕在线 | 日韩成人免费在线 | 天天干夜夜擦 | 日韩精品你懂的 | 在线观看黄色大片 | 中文字幕在线不卡国产视频 | 国产福利电影网址 | 中文字幕日本在线 | 在线视频欧美日韩 | 深夜免费福利网站 | 成人中文字幕在线 | 狠狠色综合网站久久久久久久 | 91色影院| www.五月婷婷 | 久久久久久视频 | 免费h漫在线观看 | 在线99 | 亚洲综合视频在线 | 992tv在线成人免费观看 | 久久艹在线观看 | 欧美性生爱 | 免费97视频 | 欧美在线一二区 | www.久久婷婷| 在线一区观看 | 亚洲一区二区三区在线看 | 亚洲国产69 | 麻豆精品国产传媒 | 精品一区二区精品 | 色91在线| 日日操天天操狠狠操 | 久久精品亚洲国产 | 二区中文字幕 | 免费在线一区二区 | 免费看色网站 | 日韩最新av | 五月激情久久 | 亚洲aⅴ乱码精品成人区 | 亚洲精品av中文字幕在线在线 | 精品久久久成人 | 菠萝菠萝在线精品视频 | 中文视频在线 | 国产在线观看一 | 国产一区福利 | 国产一级电影网 | 国产在线第三页 | 国产69精品久久久久久久久久 | 中文字幕av在线免费 | 97超视频 | 久久久久久久亚洲精品 | 中文字幕成人一区 | 精品在线观看视频 | 精品自拍sae8—视频 | 91精品久久久久久粉嫩 | 国产精品一区久久久久 | 韩国av电影在线观看 | 婷婷国产在线观看 | 日日日操操 | 玖玖玖在线观看 | 亚洲v精品 | 精品视频免费久久久看 | 91九色蝌蚪视频在线 | 69久久久久久久 | 免费人做人爱www的视 | 国产在线不卡精品 | 欧美日产在线观看 | 成年人免费观看在线视频 | 一区二区成人国产精品 | 国产精品久久久久久久久蜜臀 | 亚洲美女精品区人人人人 | 探花视频免费在线观看 | 99热这里只有精品8 久久综合毛片 | 成年人免费看av | 久久的色 | 亚洲激情在线 | 中文字幕影视 | 欧美最猛性xxxxx免费 | 免费a级毛片在线看 | 欧洲亚洲女同hd | 久草视频看看 | 色a在线观看 | 探花在线观看 | 操操操操网 | 伊香蕉大综综综合久久啪 | 激情丁香综合五月 | 婷婷九九 | 国产资源av | 天天干天天干天天干 | 粉嫩av一区二区三区入口 | 波多野结衣在线视频免费观看 | 久久国产精品色av免费看 | 69久久99精品久久久久婷婷 | 91色影院 | 香蕉看片 | 国产精品v欧美精品v日韩 | 又黄又爽又色无遮挡免费 | 在线观看色视频 | 久操视频在线免费看 | 国产精品毛片久久久久久 | 色婷婷婷| 日韩黄色大片在线观看 | 久久久久久国产精品免费 | 麻豆精品传媒视频 | 91av视频观看 | 国产乱对白刺激视频在线观看女王 | 免费看一及片 | 国产精品日韩在线 | 亚洲精品欧洲精品 | 97精品一区二区三区 | 91夫妻自拍 | 精品国产自在精品国产精野外直播 | 四虎视频 | 99精品在线视频观看 | 麻豆传媒在线免费看 | 在线观看av网| 狠狠色丁香婷婷综合视频 | 日韩在线免费播放 | 日本护士撒尿xxxx18 | 五月天婷亚洲天综合网精品偷 | 国产精品国产毛片 | 日韩欧美精品一区二区 | 久久婷综合 | av免费观看网站 | 天天干天天想 | 九九爱免费视频在线观看 | 日本精品久久久久中文字幕 | 永久黄网站色视频免费观看w | 免费黄色在线 | 中文在线 | 国产精品美女免费 | 天天操天天操天天操天天操天天操天天操 | 欧美综合在线观看 | 视频二区在线视频 | 久久综合九色综合网站 | 91中文字幕在线 | 国产99久久久国产精品 | 精品一区中文字幕 | 国产精品一区二区中文字幕 | 国产色a在线观看 | 国产精品嫩草影院99网站 | 欧美最爽乱淫视频播放 | 日日躁夜夜躁xxxxaaaa | 园产精品久久久久久久7电影 | www.xxx.性狂虐 | 狠狠狠色丁香综合久久天下网 | 6699私人影院 | 国产精品久久婷婷六月丁香 | 久久久久国产精品视频 | 久久久久久久久久久影院 | 在线视频久久 | 婷婷色网 | 国产精品久久久久久久毛片 | 国产精品久久久久久久久久久久午夜 | 18国产精品白浆在线观看免费 | 国产一区黄色 | 国产精品私人影院 |