久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Python帶你從淺入深探究Tuple(基礎篇)

瀏覽:2日期:2022-06-19 16:20:04
元組

Python中的元組容器序列(tuple)與列表容器序列(list)具有極大的相似之處,因此也常被稱為不可變的列表。

但是兩者之間也有很多的差距,元組側重于數據的展示,而列表側重于數據的存儲與操作。

它們非常相似,雖然都可以存儲任意類型的數據,但是一個元組定義好之后就不能夠再進行修改。

元組特性

元組的特點:

元組屬于容器序列 元組屬于不可變類型 元組底層由順序存儲組成,而順序存儲是線性結構的一種

基本聲明

以下是使用類實例化的形式進行對象聲明:

tup = tuple((1, 2, 3, 4, 5))print('值:%r,類型:%r' % (tup, type(tup)))# 值:(1, 2, 3, 4, 5),類型:<class ’tuple’>

也可以選擇使用更方便的字面量形式進行對象聲明,使用逗號對數據項之間進行分割:

tup = 1, 2, 3, 4, 5print('值:%r,類型:%r' % (tup, type(tup)))# 值:(1, 2, 3, 4, 5),類型:<class ’tuple’>

為了美觀,我們一般會在兩側加上(),但是要確定一點,元組定義是逗號分隔的數據項,而并非是()包裹的數據項:

tup = (1, 2, 3, 4, 5)print('值:%r,類型:%r' % (tup, type(tup)))# 值:(1, 2, 3, 4, 5),類型:<class ’tuple’>多維元組

當一個元組中嵌套另一個元組,該元組就可以稱為多維元組。

如下,定義一個2維元組:

tup = (1, 2, 3, 4, 5)print('值:%r,類型:%r' % (tup, type(tup)))# 值:(1, 2, 3, 4, 5),類型:<class ’tuple’>續行操作

在Python中,元組中的數據項如果過多,可能會導致整個元組太長,太長的元組是不符合PEP8規范的。

每行最大的字符數不可超過79,文檔字符或者注釋每行不可超過72

Python雖然提供了續行符,但是在元組中可以忽略續行符,如下所示:

tup = (1, 2, ('三', '四'))print('值:%r,類型:%r' % (tup, type(tup)))# 值:(1, 2, (’三’, ’四’)),類型:<class ’tuple’>類型轉換

元組支持與布爾型、字符串、列表、以及集合類型進行類型轉換:

tup = (1, 2, 3)bTup = bool(tup) # 布爾類型strTup = str(tup) # 字符串類型liTup = list(tup) # 列表類型setTup = set(tup) # 集合類型print('值:%r,類型:%r' % (bTup, type(bTup)))print('值:%r,類型:%r' % (strTup, type(strTup)))print('值:%r,類型:%r' % (liTup, type(liTup)))print('值:%r,類型:%r' % (setTup, type(setTup)))# 值:True,類型:<class ’bool’># 值:’(1, 2, 3)’,類型:<class ’str’># 值:[1, 2, 3],類型:<class ’list’># 值:{1, 2, 3},類型:<class ’set’>

如果一個2維元組遵循一定的規律,那么也可以將其轉換為字典類型:

tup = (('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'))dictTuple = dict(tup)print('值:%r,類型:%r' % (dictTuple, type(dictTuple)))# 值:{’k1’: ’v1’, ’k2’: ’v2’, ’k3’: ’v3’},類型:<class ’dict’>索引操作

元組的索引操作僅支持獲取數據項。

其他的任意索引操作均不被支持。

使用方法參照列表的索引切片一節。

絕對引用

元組擁有絕對引用的特性,無論是深拷貝還是淺拷貝,都不會獲得其副本,而是直接對源對象進行引用。

但是列表沒有絕對引用的特性,代碼驗證如下:

>>> import copy>>> # 列表的深淺拷貝均創建新列表...>>> oldLi = [1, 2, 3]>>> id(oldLi)4542649096>>> li1 = copy.copy(oldLi)>>> id(li1)4542648840>>> li2 = copy.deepcopy(oldLi)>>> id(li2)4542651208>>> # 元組的深淺拷貝始終引用老元組>>> oldTup = (1, 2, 3)>>> id(oldTup)4542652920>>> tup1 = copy.copy(oldTup)>>> id(tup1)4542652920>>> tup2 = copy.deepcopy(oldTup)>>> id(tup2)4542652920

Python為何要這樣設計?其實仔細想想不難發現,元組不能對其進行操作,僅能獲取數據項。

那么也就沒有生成多個副本提供給開發人員操作的必要了,因為你修改不了元組,索性直接使用絕對引用策略。

值得注意的一點:[:]也是淺拷貝,故對元組來說屬于絕對引用范疇。

元組的陷阱

Leonardo Rochael在2013年的Python巴西會議提出了一個非常具有思考意義的問題。

我們先來看一下:

>>> t = (1, 2, [30, 40])>>> t[-1] += [50, 60]Traceback (most recent call last): File '<stdin>', line 1, in <module>TypeError: ’tuple’ object does not support item assignment

現在,t到底會發生下面4種情況中的哪一種?

t 變成 (1, 2, [30, 40, 50, 60])。 因為 tuple 不支持對它的數據項賦值,所以會拋出 TypeError 異常。 以上兩個都不是。a 和 b 都是對的。

正確答案是4,t確實會變成 (1, 2, [30, 40, 50, 60]),但同時元組是不可變類型故會引發TypeError異常的出現。

>>> t(1, 2, [30, 40, 50, 60])

如果是使用extend()對t[-1]的列表進行數據項的增加,則答案會變成1。

我當初在看了這個問題后,暗自告訴自己了2件事情:

list的數據項增加盡量不要使用+=,而應該使用append()或者extend()

Ps:我也不知道自己為什么會產生這樣的想法,但這個想法確實伴隨我很長時間,直至現在

tuple中不要存放可變類型的數據,如list、set、dict等..

元組更多的作用是展示數據,而不是操作數據。

舉個例子,當用戶根據某個操作獲取到了眾多數據項之后,你可以將這些數據項做出元組并返回。

用戶對被返回的原對象只能看,不能修改,若想修改則必須創建新其他類型對象。

解構方法

元組的解構方法與列表使用相同。

使用方法參照列表的解構方法一節。

常用方法

方法一覽

常用的list方法一覽表:

方法名 返回值 描述 count() integer 返回數據項在T中出現的次數 index() integer 返回第一個數據項在T中出現位置的索引,若值不存在,則拋出ValueError

基礎公用函數:

函數名 返回值 描述 len() integer 返回容器中的項目數 enumerate() iterator for index, value of iterable 返回一個可迭代對象,其中以小元組的形式包裹數據項與正向索引的對應關系 reversed() ... 詳情參見函數章節 sorted() ... 詳情參見函數章節 獲取長度

使用len()方法來獲取元組的長度。

返回int類型的值。

tup = ('A', 'B', 'C', 'D', 'E', 'F', 'G')print(len(tup))# 7

Python在對內置的數據類型使用len()方法時,實際上是會直接的從PyVarObject結構體中獲取ob_size屬性,這是一種非常高效的策略。

PyVarObject是表示內存中長度可變的內置對象的C語言結構體。

直接讀取這個值比調用一個方法要快很多。

統計次數

使用count()方法統計數據項在該元組中出現的次數。

返回int:

tup = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'A')aInTupCount = tup.count('A')print(aInTupCount)# 2查找位置

使用index()方法找到數據項在當前元組中首次出現的位置索引值,如數據項不存在則拋出異常。

返回int。

tup = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'A')aInTupIndex = tup.index('A')print(aInTupIndex)# 0底層探究內存開辟

Python內部實現中,列表和元組還是有一定的差別的。

元組在創建對象申請內存的時候,內存空間大小便進行了固定,后續不可更改(如果是傳入了一個可迭代對象,例如tupe(range(100)),這種情況會進行擴容與縮容,下面的章節將進行探討研究)。

而列表在創建對象申請內存的時候,內存空間大小不是固定的,如果后續對其新增或刪除數據項,列表會進行擴容或者縮容機制。

元組創建

空元組

若創建一個空元組,會直接進行創建,然后將這個空元組丟到緩存free_list中。

元組的free_list最多能緩存 20 * 2000 個元組,這個在下面會進行講解。

如圖所示:

元組轉元組

這樣的代碼會進行元組轉元組:

tup = tuple((1, 2, 3))

首先內部本身就是一個元組(1, 2, 3),所以會直接將內部的這個元組拿出來并返回引用,并不會再次創建。

代碼驗證:

>>> oldTup = (1, 2, 3)>>> id(oldTup)4384908128>>> newTup = tuple(oldTup)>>> id(newTup)4384908128>>>列表轉元組

列表轉元組會將列表中的每一個數據項都拿出來,然后放入至元組中:

tup = tuple([1, 2, 3])

所以你會發現,列表和元組中的數據項引用都是相同的:

>>> li1 = ['A', 'B', 'C']>>> tup = tuple(li1)>>> print(id(li1[0]))4383760656>>> print(id(tup[0]))4383760656>>>可迭代對象轉元組

可迭代對象是沒有長度這一概念的,如果是可迭代對象轉換為元組,會先對可迭代對象的長度做一個猜想。

并且根據這個猜想,為元組開辟一片內存空間,用于存放可迭代對象的數據項。

然后內部會獲取可迭代對象的迭代器,對其進行遍歷操作,拿出數據項后放至元組中。

如果猜想的長度太小,會導致元組內部的內存不夠存放下所有的迭代器數據項,此時該元組會進行內部的擴容機制,直至可迭代對象中的數據項全部被添加至元組中。

rangeObject = range(1, 101)tup = tuple(rangeObject)// 假如猜想的是9// 第一步:+ 10 // 第二步:+ (原長度+10) * 0.25// 其實,就是增加【原長度*0.25 + 2.5】

如果猜想的長度太大,而實際上迭代器中的數據量偏少,則需要對該元組進行縮容。

切片取值

對元組進行切片取值的時候,會開辟一個新元組用于存放切片后得到的數據項。

tup = (1, 2, 3)newSliceTup = tup[0:2]

當然,如果是[:]的操作,則參照絕對引用,直接返回被切片的元組引用。

代碼驗證:

>>> id(tup)4384908416>>> newSliceTup = tup[0:2]>>> id(newSliceTup)4384904392緩存機制

free_list緩存

元組的緩存機制和列表的緩存機制不同。

元組的free_list會緩存0 - 19長度的共20種元組,其中每一種長度的元組通過單向鏈表橫向擴展緩存至2000個,如下圖所示:

當每一次的del操作有數據項的元組時,都會將該元組數據項清空并掛載至free_list單向鏈表的頭部的位置。

del 元組1del 元組2del 元組3

如下圖所示:

當要創建一個元組時,會通過創建元組的長度,從free_list單向鏈表的頭部取出一個元組,然后將數據項存放進去。

前提是free_list單向鏈表中緩存的有該長度的元組。

tup = (1, 2, 3)空元組與非空元組的緩存

空元組的緩存是一經創建就緩存到free_list單向鏈表中。

而非空元組的緩存必須是del操作后才緩存到free_list單向鏈表中。

空元組的創建

第一次創建空元組后,空元組會緩存至free_list單向鏈表中。

以后的每一次空元組創建,返回的其實都是同一個引用,也就是說空元組在free_list單向鏈表中即使被引用了也不會被銷毀。

>>> t1 = ()>>> id(t1)4511088712>>> t2 = ()>>> id(t2)4511088712非空元組的創建

當free_list單向鏈表中有相同長度的元組時,會進行引用并刪除。

這個在上圖中已經示例過了,就是這個:

代碼示例:

$ python3Python 3.6.8 (v3.6.8:3c6b436a57, Dec 24 2018, 02:04:31)[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwinType 'help', 'copyright', 'credits' or 'license' for more information.>>> v1 = (None, None, None)>>> id(v1)4384907696>>> v2 = (None, None, None)>>> id(v2)4384908056>>> del v1>>> del v2 # ①>>> v3 = (None, None, None)>>> id(v3) # ②4384908056>>> v4 = (None, None, None)>>> id(v4) # ③4384907696>>>

①:free_list num_free=3 單向鏈表結構:v2 —> v1

②:創建了v3,拿出v2的空元組,填入v3數據項,故v2和v3的id值相等,證明引用同一個元組,此時free_list num_free=3 單向鏈表結構為:—> v1

③:創建了v4,拿出v1的空元組,填入v4數據項,故v1和v4的id值相等,證明引用同一個元組

tupleobject.c源碼

官網參考:點我跳轉

源碼一覽:點我跳轉

以下是截取了一些關鍵性源代碼,并且做上了中文注釋,方便查閱。

每一個元組都有幾個關鍵性的屬性:

Py_ssize_t ob_refcnt; // 引用計數器Py_ssize_t ob_size; // 數據項個數,即元組大小PyObject *ob_item[1]; // 存儲元組中的數據項 [指針, ]

關于緩存free_list的屬性:

PyTuple_MAXSAVESIZE // 相當于圖中的 free_num ,最大20,即縱向擴展的緩存元組長度PyTuple_MAXFREELIST // 圖中 free_list 的橫向擴展緩存列表個數,最大2000創建元組

空元組

PyObject *PyTuple_New(Py_ssize_t size){ PyTupleObject *op; // 緩存相關 Py_ssize_t i;// 元組的大小不能小于0 if (size < 0) {PyErr_BadInternalCall();return NULL; }#if PyTuple_MAXSAVESIZE > 0 // 創建空元組,優先從緩存中獲取 // size = 0 表示這是一個空元組,從free_list[0]中獲取空元組 if (size == 0 && free_list[0]) {// op就是空元組op = free_list[0];// 新增空元組引用計數器 + 1Py_INCREF(op);#ifdef COUNT_ALLOCStuple_zero_allocs++;#endif// 返回空元組的指針return (PyObject *) op; }// 如果創建的不是空元組,且這個創建的元組數據項個數小于20,并且free_list[size]不等于空,表示有緩存 // 則從緩存中去獲取,不再重新開辟內存 if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {// 拿出元組free_list[size] = (PyTupleObject *) op->ob_item[0];// num_free減1numfree[size]--;#ifdef COUNT_ALLOCSfast_tuple_allocs++;#endif/* Inline PyObject_InitVar */// 初始化,定義這個元組的長度為數據項個數#ifdef Py_TRACE_REFSPy_SIZE(op) = size;// 定義類型為 tuplePy_TYPE(op) = &PyTuple_Type;#endif// 增加一次新的引用_Py_NewReference((PyObject *)op); }// 如果是空元組 else#endif {// 檢查內存情況,是否充足/* Check for overflow */if ((size_t)size > ((size_t)PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)) / sizeof(PyObject *)) { return PyErr_NoMemory();}// 開辟內存,并獲得一個元組:opop = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);if (op == NULL) return NULL; }// 空元組的每一個槽位都是NULL for (i=0; i < size; i++)op->ob_item[i] = NULL;#if PyTuple_MAXSAVESIZE > 0 // 緩存空元組 if (size == 0) {free_list[0] = op;++numfree[0];Py_INCREF(op); /* extra INCREF so that this is never freed */ }#endif#ifdef SHOW_TRACK_COUNT count_tracked++;#endif // 將元組加入到GC機制中,用于內存管理 _PyObject_GC_TRACK(op); return (PyObject *) op;}可迭代對象轉元組

這個不在tupleobject.c源碼中,而是在abstract.c源碼中。

官網參考:點我跳轉

源碼一覽:點我跳轉

PyObject *PySequence_Tuple(PyObject *v){ PyObject *it; /* iter(v) */ Py_ssize_t n; /* guess for result tuple size */ PyObject *result = NULL; Py_ssize_t j; if (v == NULL) {return null_error(); } /* Special-case the common tuple and list cases, for efficiency. */ // 如果是元組轉換元組,如 tup = (1, 2, 3) 或者 tup = ((1, 2, 3))直接返回內存地址 if (PyTuple_CheckExact(v)) {Py_INCREF(v);return v; }// 如果是列表轉換元組,則執行PyList_AsTuple(),將列表轉換為元組 // 如 tup = ([1, 2, 3]) if (PyList_CheckExact(v))return PyList_AsTuple(v); /* Get iterator. */ // 獲取迭代器, tup = (range(1, 4).__iter__()) it = PyObject_GetIter(v); if (it == NULL)return NULL; /* Guess result size and allocate space. */ // 猜想迭代器長度,也就是猜一下有多少個數據項 n = PyObject_LengthHint(v, 10); if (n == -1)goto Fail; // 根據猜想的迭代器長度,進行元組的內存開辟 result = PyTuple_New(n); if (result == NULL)goto Fail; /* Fill the tuple. */ // 將迭代器中每個數據項添加至元組中 for (j = 0; ; ++j) {PyObject *item = PyIter_Next(it);if (item == NULL) { if (PyErr_Occurred())goto Fail; break;}//如果迭代器中數據項比猜想的多,則證明開辟內存不足需要需要進行擴容if (j >= n) { size_t newn = (size_t)n; /* The over-allocation strategy can grow a bit faster than for lists because unlike lists the over-allocation isn’t permanent -- we reclaim the excess before the end of this routine. So, grow by ten and then add 25%. */// 假如猜想的是9 // 第一步:+ 10 // 第二步:+ (原長度+10) * 0.25 // 其實,就是增加【原長度*0.25 + 2.5】newn += 10u; newn += newn >> 2;// 判斷是否超過了元組的數據項個數限制(sys.maxsize) if (newn > PY_SSIZE_T_MAX) {/* Check for overflow */PyErr_NoMemory();Py_DECREF(item);goto Fail; } n = (Py_ssize_t)newn; // 擴容機制 if (_PyTuple_Resize(&result, n) != 0) {Py_DECREF(item);goto Fail; }}// 將數據項放入元組之中PyTuple_SET_ITEM(result, j, item); } /* Cut tuple back if guess was too large. */// 如果猜想的數據項太多,而實際上迭代器中的數據量偏少 // 則需要對該元組進行縮容 if (j < n &&_PyTuple_Resize(&result, j) != 0)goto Fail; Py_DECREF(it); return result;Fail: Py_XDECREF(result); Py_DECREF(it); return NULL;}列表轉元組

這個不在tupleobject.c源碼中,而是在listobject.c源碼中。

官網參考:點我跳轉

源碼一覽:點我跳轉

PyObject *PyList_AsTuple(PyObject *v){ PyObject *w; PyObject **p, **q; Py_ssize_t n; // 例如:tup = ([1, 2, 3])// 進行列表的驗證 if (v == NULL || !PyList_Check(v)) {PyErr_BadInternalCall();return NULL; }// 獲取大小,即數據項個數 n = Py_SIZE(v); // 開辟內存 w = PyTuple_New(n);// 如果是空元組 if (w == NULL)return NULL; // 執行遷徙操作 p = ((PyTupleObject *)w)->ob_item; q = ((PyListObject *)v)->ob_item;// 將列表中數據項的引用,也給元組進行引用 // 這樣列表中數據項和元組中的數據項都引用同1個對象 while (--n >= 0) {// 數據項引用計數 + 1Py_INCREF(*q);*p = *q;p++;q++; }// 返回元組 return w;}切片取值

PyObject *PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)// 切片會觸發該方法{ // 如果對空元組進行切片,則會拋出異常 if (op == NULL || !PyTuple_Check(op)) {PyErr_BadInternalCall();return NULL; } // 內部的具體實現方法 return tupleslice((PyTupleObject *)op, i, j);}static PyObject *tupleslice(PyTupleObject *a, Py_ssize_t ilow, Py_ssize_t ihigh){ PyTupleObject *np; PyObject **src, **dest; Py_ssize_t i; Py_ssize_t len;// 計算索引位置 if (ilow < 0)ilow = 0; if (ihigh > Py_SIZE(a))ihigh = Py_SIZE(a); if (ihigh < ilow)ihigh = ilow; // 如果是[:]的操作,則直接返回源元組對象a的指針,即絕對引用 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {Py_INCREF(a);return (PyObject *)a; }// 初始化新的切片對象元組長度 len = ihigh - ilow;// 開始切片,創建了一個新元組np np = (PyTupleObject *)PyTuple_New(len); if (np == NULL)return NULL; src = a->ob_item + ilow; dest = np->ob_item;// 對源元組中的數據項的引用計數+1 for (i = 0; i < len; i++) {PyObject *v = src[i];Py_INCREF(v);dest[i] = v; }// 返回切片對象新元組np的引用 return (PyObject *)np;}緩存相關

static voidtupledealloc(PyTupleObject *op){ Py_ssize_t i; Py_ssize_t len = Py_SIZE(op); PyObject_GC_UnTrack(op); Py_TRASHCAN_SAFE_BEGIN(op)// 如果元組的長度大于0,則不是一個非空元組 if (len > 0) {i = len;// 將內部的數據項引用計數都 - 1while (--i >= 0) Py_XDECREF(op->ob_item[i]);#if PyTuple_MAXSAVESIZE > 0// 準備緩存,判斷num_free是否小于20,并且單向鏈表中的已緩存元組個數小于2000if (len < PyTuple_MAXSAVESIZE && numfree[len] < PyTuple_MAXFREELIST && Py_TYPE(op) == &PyTuple_Type){ // 添加至鏈表頭部 op->ob_item[0] = (PyObject *) free_list[len]; // 將num_free + 1 numfree[len]++; free_list[len] = op; goto done; /* return */}#endif } // 內存中進行銷毀 Py_TYPE(op)->tp_free((PyObject *)op);done: Py_TRASHCAN_SAFE_END(op)}

以上就是老Python帶你從淺入深探究Tuple的詳細內容,更多關于Python Tuple的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 俺要去97中文字幕 | 免费中文字幕日韩欧美 | 日韩毛片 | 欧美国产日韩一区二区 | 日本精品一区二 | 国产精品一区二区久久久久 | 啊v在线| 成人在线精品视频 | 精品久久久久久久久久久久 | 在线观看视频一区二区三区 | 国产一区二区免费视频 | 一级黄色录像在线观看 | 九草在线| 久久精品色欧美aⅴ一区二区 | 欧美综合久久 | 中文字幕一区二区在线观看 | 天天摸夜夜摸爽爽狠狠婷婷97 | 国产一区二区av在线 | 国产乱码精品一区二区三区手机版 | 日韩在线中文 | 欧美激情一区二区三区四区 | 中文字幕亚洲一区 | 亚洲一区二区三区在线视频 | 国产福利在线 | 亚洲色图在线播放 | 亚洲精品成人a8198a | 欧美高清成人 | 国产精品亚洲欧美日韩一区在线 | 亚洲污视频 | 日韩精品在线观看视频 | 久久国产欧美日韩精品 | 在线免费毛片 | 国产视频一区二区三区四区 | 中文字幕亚洲一区二区三区 | 欧美日韩电影一区二区三区 | 久久高清毛片 | 久久久久久久久久久久久九 | 玖色视频| 久久久国产精品 | 久久久久一区二区 | 国产一级免费视频 | 91九色在线| 日本一区二区高清不卡 | 国产伦精品一区二区三区四区视频 | 久久成人综合 | 亚洲乱码国产乱码精品精的特点 | 国产成人av一区二区三区 | 亚洲成人免费视频 | 特级毛片 | 欧美日韩国产不卡 | 欧美精品日韩 | 黄网站色大毛片 | 中文字幕在线三区 | 久久成人国产精品 | 一区二区免费在线 | 玖玖玖视频 | 欧美精产国品一二三区 | 国内在线一区 | 日韩欧美国产一区二区 | 国产毛片一区二区 | 国产精品久久久久久久久久免费 | 欧美国产日韩一区二区 | 亚洲自拍偷拍欧美 | 亚洲美乳中文字幕 | 在线观看国产wwwa级羞羞视频 | 欧美精品国产精品 | 黄色免费网| 国产在线小视频 | 日韩影音| 欧美日韩h | www.久久久.com | 国产精品久久久久久久一区探花 | 久久久成人精品 | 亚洲精品一区二区三区蜜桃久 | 欧美啪啪 | 亚洲 中文 欧美 日韩 在线观看 | 精品福利av导航 | 欧美国产日本一区 | 亚洲一区二区三区四区在线观看 | 亚洲精品一区二区三区在线观看 | 国产精品久久久久久久久久久久冷 | 免费观看一级毛片 | 成人三级在线 | 国产精品国产三级国产aⅴ9色 | 中文字幕高清在线 | 国产91久久精品一区二区 | 在线观看黄免费 | 亚洲免费视频网 | 欧美成人激情 | 久久久久国产精品午夜一区 | 一级欧美片 | 在线中文字幕视频 | 国产精品成人国产乱一区 | 久久免费黄色网址 | 亚洲精品网址 | 亚洲一区二区在线 | 国产欧美日韩精品一区二区三区 | 国产精品久久久久久亚洲调教 | 成人午夜激情 | 亚洲欧美一区二区三区久久 | 亚洲97 | 日韩精品视频久久 | 日日干夜夜操 | 天堂中文网 | 91日韩欧美 | 日韩手机电影 | 亚洲精品一区二三区不卡 | 日韩精品免费在线观看 | 三级av在线 | 美女诱惑av | 亚洲一区二区三区四区在线 | www国产亚洲精品久久网站 | 成人免费在线视频播放 | 成人在线视频网 | 天天干在线影院 | 中文字幕日韩在线 | 久久久久久影院 | 一区二区三区小视频 | 成人h漫在线观看 | 黄网站免费在线观看 | 亚洲成人中文字幕 | 国产精品丝袜一区二区 | 国产精品爱久久久久久久 | 日韩三级中文字幕 | 啪啪的网站| 国产精品久久久久久久久免费丝袜 | 欧美精品免费在线 | 久在线草 | 亚洲精品四区 | 精品久久久久久久人人人人传媒 | 中文字幕第90页 | 久久久精品久久 | 国产91在线观看 | 久草久草久草 | 亚洲一区二区三区免费观看 | 91福利网站在线观看 | 一级片免费视频 | 干一干操一操 | 精品久久久久久国产 | 欧美视频一区 | 精品久久国产 | 日本三级电影天堂 | a视频在线观看 | 五月婷婷婷婷 | 国产成人午夜精品5599 | 色爽av| 99re在线| 亚洲在线播放 | 欧美激情a∨在线视频播放 成人免费共享视频 | 日韩aaa久久蜜桃av | 欧美高潮 | 亚洲一区二区三区久久久 | 欧美极品视频 | 成人精品在线视频 | 天堂中文视频在线观看 | 亚洲中国字幕 | 久久久国产视频 | 亚洲国内精品 | 国产精品视频久久久 | 视频二区在线观看 | 久草精品视频 | 亚洲免费在线观看视频 | 一区二区三区欧美在线 | 97国产超碰 | 精品美女久久久 | 中文字幕一区在线观看视频 | 国产精品久久久久久久久久久久久 | 国产不卡视频在线观看 | jizz在线观看 | 一区二区三区在线观看视频 | 999久久久国产999久久久 | av一区二区在线播放 | 亚洲毛片网站 | 欧美成人精品在线 | 91免费看片 | 国产精品毛片久久久久久久 | 日韩美女av在线 | 日韩精品网站在线观看 | 日韩精品无码一区二区三区 | 成人精品一区二区 | 涩久久| 看免费av| 国产精品成人久久久久 | 夜本色| 蜜臀一区| 一区二区三区视频在线 | www.一区二区三区 | 一级毛片免费完整视频 | 国产免费一区二区三区 | h视频网站在线 | 韩国成人精品a∨在线观看 国产伊人av | 特黄特色大片免费视频观看 | 日韩一级免费在线观看 | 国产精品久久精品久久 | 一区精品视频 | 在线亚洲精品 | 国产一区二区三区在线 | 超碰天天| japanhd熟睡侵犯 | 欧美日韩一区二区在线观看 | 成人免费淫片aa视频免费 | 亚洲 欧美 激情 另类 校园 | 中字一区 | 欧美日韩在线二区 | 国产精品毛片久久久久久 | 国产日韩欧美不卡 | 精品日韩欧美一区二区三区在线播放 | 国产精久久一区二区三区 | 中文字幕在线资源 | 激情综合久久 | 91精品国产一区二区 | 九色av| 亚洲爽爽 | 成人国产在线 | 久久国产精品一区二区 | 亚洲成av人片在线观看 | www.欧美日韩 | 国产一区二区成人 | 亚洲高清在线 | 国产亚洲精品久久久久动 | 久久高清精品 | 日韩av网页 | 国产成人免费视频网站高清观看视频 | 精品国产不卡一区二区三区 | k8久久久一区二区三区 | 欧美精产国品一二三区 | 国产精品精品视频一区二区三区 | 欧美综合激情 | 国产在线精品一区 | 国产乱码精品一区二区三区中文 | 蜜臀精品久久久久久蜜臀 | 漂亮少妇videoshd忠贞 | 不卡一区| 国产一区二区三区免费 | 欧美一级片在线观看 | 亚洲免费人成在线视频观看 | 天天操天天插 | 亚洲一区二区av | 亚洲精美视频 | 久久久久久久久久国产精品 | www伊人| 在线高清av | 国产高清精品一区二区三区 | 99精品久久| 精品国精品国产自在久不卡 | 国产一区二区三区四区 | 综合一区二区三区 | 夜夜骑首页 | 中国妞xxxhd露脸偷拍视频 | 亚洲wu码 | 久久网国产 | 欧美福利专区 | 日本一级中文字幕久久久久久 | 精品久久久久久久久福利 | 久久久99久久久国产自输拍 | 一区二区三区四区视频 | 操人网址| 欧美激情亚洲 | 精品一区二区三区免费毛片爱 | 在线免费国产视频 | 日韩国产欧美亚洲 | 成人综合视频在线 | 久久精品99 | 久久久久久亚洲精品视频 | 成年视频在线观看福利资源 | 国产精品久久久久久亚洲调教 | 国产伦精品一区二区三区四区视频 | 亚洲一区二区三区高清 | 亚洲高清视频在线 | 欧美综合区 | 日韩免费一区 | 老妇激情毛片免费 | 成人精品视频在线观看 | 日韩国产精品一区二区三区 | 在线国产一区二区 | 亚洲一区二区中文字幕 | 欧美日韩中文字幕 | 亚洲欧美在线一区 | 中字一区| zzzwww在线观看免 | 国产精品久久久久久久久 | 亚洲精品视频在线 | 亚洲国内精品 | 色资源 | 日韩av免费在线观看 | 久久久久免费精品视频 | 91精品国产综合久久福利软件 | 激情综合网五月婷婷 | 成人网电影 | 亚洲人成人一区二区在线观看 | 精品美女在线观看视频在线观看 | 日韩视频一区在线观看 | 亚洲精品视频在线播放 | 性开放xxxhd视频 | 亚洲首页| av免费在线播放 | 欧美在线播放一区 | 黑人巨大精品欧美一区免费视频 | 日本一本在线 | 欧美视频在线免费看 | 国产一区二区视频在线观看 | 91极品国产| 激情综合五月 | 中文一区二区 | 狠狠爱www人成狠狠爱综合网 | 成人亚洲 | 操片| 日韩中文视频 | 成人精品一区二区三区中文字幕 | 三级在线视频 | 日韩国产欧美视频 | 日韩中文字幕一区 | 色婷综合网 | 天天操天天插天天干 | 国产一区二区三区久久久 | av国产精品| 99热热热热 | 国产一区久久 | 欧美中文字幕在线 | 奇米影视77 | 成人福利视频 | 成人免费毛片高清视频 | 国产精品成人免费视频 | 日本福利视频 | 国产一区| 亚洲国产精品一区二区久久,亚洲午夜 | 日韩福利一区二区 | 日日夜夜免费精品视频 | 欧洲精品在线视频 | 久久久久999 | 日韩一区二区视频在线 | av一道本 | 欧美日韩国产高清视频 | 999在线观看精品免费不卡网站 | 欧美在线综合视频 | 国产精品免费看 | 亚洲一区二区三区视频 | 午夜精品视频在线观看 | 亚洲精品不卡 | 91精品国产91久久久久久黑人 | 日韩中文字幕一区二区 | 天天草天天干天天 | 日韩在线免费观看视频 | 免费成人高清在线视频 | 欧美日韩一区二区三区视频 | 国产在线激情视频 | 久久久精品网 | 99精品国产高清一区二区麻豆 | 日韩一区二区在线免费 | 日韩中文字幕一区二区 | 日本久久成人 | 亚洲怡红院在线观看 | 国产一区二区欧美 | 在线播放亚洲 | 欧洲视频一区二区三区 | 国产精品视频一区二区三区 | 成年人在线看 | 懂色av色香蕉一区二区蜜桃 | 国产成人在线一区二区 | 国产伦精品一区二区三区在线 | 亚洲一区二区三区四区五区中文 | 伊人福利视频 | 蜜臀91精品国产高清在线观看 | 久久婷婷麻豆国产91天堂 | 久久99国产精品久久99果冻传媒 | 日韩综合一区二区 | 成人亚洲 | 一本色道精品久久一区二区三区 | 91久久 | 国产精品日韩欧美 | 国产一区二区在线免费观看 | 亚洲精品久久久狠狠狠爱 | 日本视频黄 | 久久成人免费视频 | 日韩一二区视频 | 91社区在线播放 | 欧美free性丝袜xxxxhd | 欧美日韩国产一区二区三区 | 天天天天天天天天操 | 国内久久精品 | 日本在线观看www | 毛片链接| 久久久中文字幕 | 国产高清一区二区三区 | 成人精品视频免费 | 一区二区毛片 | 国产成人影院 | 欧美一级片在线观看 | 成人免费影院 | 精产国产伦理一二三区 | 狠狠se| 久久久久国 | 精品一区二区三区视频 | 午夜精品久久久久久久久久久久久 | 欧美一区二区三区在线观看视频 | 日韩精品小视频 | 亚洲一区二区三区四区五区中文 | 午夜私人影院 | 伊人天天操| 久久精品亚洲一区 | 日韩免费观看视频 | 欧美在线亚洲 | 一区二区在线 | 国精品一区 | 欧美专区在线 | 97国产精品视频 | 亚洲精品一区二区三区中文字幕 | 99亚洲 | 日韩在线欧美 | 视频在线一区 | 日韩免费视频 | 成人精品免费视频 | 成人av免费观看 | 日韩高清中文字幕 | 国产一区影院 | 91在线观看视频 | 中文字幕在线免费播放 | 久久国内精品 | 国产一级免费 | 日韩成人精品在线 | av中文字幕网 | 久久久精品欧美一区二区免费 | 欧美a√| av在线毛片 | 操操日| 欧美视频网站 | 男人的天堂亚洲 | 国产亚洲欧美一区二区 | 久久久久久精 | 国产精品极品美女在线观看免费 | 99亚洲视频 | 你懂的在线视频播放 | 亚洲成人精品久久 | 国产男女免费视频 | 国产精品久久久久久婷婷天堂 | 欧美中文在线 | 国产成人午夜精品5599 | 久久精品免费观看视频 | 国产高清不卡 | 亚洲男人天堂网 | 午夜视频黄 | 久久久精品一区二区 | 国产69久久| 自拍偷拍第一页 | 欧洲成人午夜免费大片 | 国产成人综合网 | 国产在线中文字幕 | 午夜免费观看视频 | 国产精品成人一区二区三区 | 日本一区二区三区四区 | 欧美日本韩国一区二区三区 | 一区毛片 | 欧美午夜电影 | 久久精品国产99国产 | 亚洲国产精品久久人人爱 | 亚洲一区免费观看 | 免费国产一区二区 | 欧美视频三区 | 亚洲日韩中文字幕一区 | 久久9999久久 | 免费日韩av | 免费国产视频 | 羞羞视频网站在线免费观看 | 亚洲视频免费网站 | 午夜精品一区 | 国产福利91精品一区二区 | 一区二区在线看 | 中文字幕高清视频 | 欧美视频综合 | 国产精品久久久久久久午夜片 | 欧美一区二区三区精品 | t66y最新地址一地址二69 | 99国产精品久久久久久久 | 91精品一区二区三区久久久久久 | 后进极品白嫩翘臀在线视频 | 国产在线一区观看 | 日韩中文字幕在线视频 | 国产一区二区三区免费 | 中文一区| 欧美日韩国产精品一区二区亚洲 | 国产精品99久久久久久动医院 | 日本jizz在线观看 | 中文字幕一区二区在线观看 | 欧美二区精品 | 午夜av影视| 亚洲欧洲日韩在线 | 欧美日韩国产中文 | 蜜桃视频精品 | 久久久看片 | 二区国产 | 在线播放91 | 欧美精品99 | 欧美日韩午夜精品 | 狠狠干欧美 | 欧美在线一区二区三区 | 私人毛片免费高清视频 | 国产精品久久久久久 | 亚洲永久免费 | 久久综合成人精品亚洲另类欧美 | 成人精品视频在线观看 | 妞干网av| 狠狠色狠狠色合久久伊人 | 欧美日韩成人激情 | 日韩成人一区 | 中文在线播放 | 国产欧美日韩综合精品 | 国产999免费视频 | 精品超碰 | 亚洲成人观看 | 国产精品久久久久久久久福交 | 最新日韩一区 | 凹凸日日摸日日碰夜夜 | 在线播放亚洲 | 日韩特黄一级欧美毛片特黄 | 成人精品一区二区三区电影黑人 | 一级片黄色免费 | www精品美女久久久tv | 亚洲一级毛片 | 久久香蕉国产视频 | 成人天堂资源www在线 | 免费黄色在线视频 | 免看一级一片 | 看毛片软件| 久久精品久久久 | 久久亚洲一区二区 | 中字精品| 国产精品久久久久久久久免费桃花 | 亚洲一区欧美一区 | 91在线视频在线观看 | 91极品在线 | 品久久久久久久久久96高清 | 欧美一区二区在线免费观看 | 日韩城人网站 | 91日韩精品一区二区三区 | 久久亚洲精品国产一区 | 午夜视频福利 | 欧美日韩综合视频 | 国模精品视频一区二区 | 最新精品在线 | 蜜桃视频一区二区 | 午夜视频在线观看网站 | 精品久久久久久久人人人人传媒 | 男人天堂网av | 精品久久香蕉国产线看观看亚洲 | 国产一级片儿 | 国产日韩一区二区 | 成人免费一区二区三区视频网站 | 成人在线欧美 | 一区二区三区国产 | 欧美国产精品一区二区 | 日韩1区3区4区第一页 | 日韩精品中文字幕在线播放 | 欧美日本久久 | 精品久久久免费视频 | 亚洲三级视频 | 国产羞羞视频在线观看 | 日韩视频在线观看 | 日韩久久网 | 91精品久久久久久久久久入口 | 色一级 | 日韩日b视频 | 91九色视频| 黄网站在线播放 | 亚洲国产精品一区二区www | 激情com| 在线观看国产wwwa级羞羞视频 | 国产成人午夜精品影院游乐网 | 日韩一区在线播放 | 欧美a网站 | 亚洲精品视频在线 | 99er视频| 日本成人一二三区 | av免费在线观看网站 | 久久人人爽人人爽人人片亚洲 | 日韩精品视频免费在线观看 | 奇米在线777 | 日韩a∨精品日韩在线观看 山岸逢花在线 | 欧美日韩在线观看一区二区三区 | 亚洲成人高清在线 | 日韩在线中文字幕 | 91久久久久久久久久久 | 国产精品久久久久久久久久久久 | 日韩一区二区三区av | 久久首页| 91精品国产综合久久久久久丝袜 | 日本精品一区二区三区视频 | 日韩精品av一区二区三区 | 日本在线观看 | 一区二区国产精品 | 久久久久久国产免费 | 亚洲网站在线观看 | 欧美日韩视频在线第一区 | 一区免费视频 | 伊人热久久婷婷 | 国产欧美精品一区二区三区四区 | 91麻豆精品国产91久久久久久久久 | 亚洲日韩中文字幕 | 91麻豆产精品久久久久久 | 欧美成人h版在线观看 | 9久9久 | 99这里只有精品视频 | 亚洲精品乱码久久久久久不卡 | 国产另类ts人妖一区二区 | 色偷偷888欧美精品久久久 | av一区二区三区四区 | 一区二区色 | 大香伊蕉在人线视频777 | 国产99久久精品一区二区永久免费 | 99国产精品久久久久久久久久 | 久久综合狠狠综合久久综合88 | 麻豆资源| 欧美午夜精品久久久久久蜜 | 国产精品久久久久久一区二区三区 | 犬夜叉在线观看 | 啊v在线视频 |