精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

列表作為序列型對象都支持哪些操作,它們在底層是怎么實現的?

開發 前端
列表擁有非常多的方法,比如添加元素、查詢元素等,這些都屬于列表的自定義方法。當然不光是列表,任何對象都可以有自己的自定義方法,而這些方法會保存在類型對象的 tp_methods 里面。

楔子

列表擁有非常多的方法,比如添加元素、查詢元素等,這些都屬于列表的自定義方法。當然不光是列表,任何對象都可以有自己的自定義方法,而這些方法會保存在類型對象的 tp_methods 里面。

圖片圖片

當然列表除了擁有自定義的方法之外,還擁有作為序列型對象所共有的方法,比如合并、基于索引和切片獲取元素、基于索引和切片設置元素等等。

圖片圖片

這些方法會基于種類被抽象成三個方法簇,分別是:

  • tp_as_number:數值型對象擁有的方法;
  • tp_as_sequence:序列型對象擁有的方法;
  • tp_as_mapping:映射型對象擁有的方法;

每個方法簇都包含了大量的 C 函數,每個 C 函數一般會對應 Python 里的一個魔法方法和操作符。比如 tp_as_sequence 的 sq_concat 對應序列型對象的 __add__ 方法,tp_as_number 的 nb_subtract 對應數值型對象的 __sub__ 方法。

那么接下來我們就詳細剖析一下這些方法的具體實現過程。

列表的相加

序列型對象都實現了加法運算,比如列表,兩個列表相加可以合并為一個新的列表。

print([1, 2, 3] + [4, 5])  
"""
[1, 2, 3, 4, 5]
"""

雖然使用了 + 操作符,但它在底層是由 tp_as_sequence.sq_concat 負責實現的,該字段被賦值為 list_concat 函數,看一下它的內部邏輯。

// Objects/listobject.c
static PyObject *
list_concat(PyListObject *a, PyObject *bb)
{   
    // 兩個列表相加之后的新列表的長度
    Py_ssize_t size;
    Py_ssize_t i;
    PyObject **src, **dest;
    PyListObject *np;
    // 如果 bb 不是列表,拋出 TypeError
    if (!PyList_Check(bb)) {
        PyErr_Format(PyExc_TypeError,
                  "can only concatenate list (not \"%.200s\") to list",
                  Py_TYPE(bb)->tp_name);
        return NULL;
    }
#define b ((PyListObject *)bb)
    // 兩個列表的長度相加一定小于 PY_SSIZE_T_MAX
    assert((size_t)Py_SIZE(a) + (size_t)Py_SIZE(b) < PY_SSIZE_T_MAX);
    // 新列表的長度,等于相加的兩個列表的長度之和
    size = Py_SIZE(a) + Py_SIZE(b);
    // 如果長度為 0,那么創建一個空列表,然后返回即可
    if (size == 0) {
        return PyList_New(0);
    }
    // 為 PyListObject 和底層數組申請空間(空間大小為 8 * size)
    np = (PyListObject *) list_new_prealloc(size);
    if (np == NULL) {
        return NULL;
    }
    // 將第一個列表的元素增加引用計數之后,拷貝到新列表中
    src = a->ob_item;
    dest = np->ob_item;
    for (i = 0; i < Py_SIZE(a); i++) {
        PyObject *v = src[i];
        dest[i] = Py_NewRef(v);
    }
    // 將第二個列表的元素增加引用計數之后,拷貝到新列表中
    src = b->ob_item;
    dest = np->ob_item + Py_SIZE(a);
    for (i = 0; i < Py_SIZE(b); i++) {
        PyObject *v = src[i];
        dest[i] = Py_NewRef(v);
    }
    // 將新列表的 ob_size 設置為 size
    Py_SET_SIZE(np, size);
    // 轉成泛型指針之后返回
    return (PyObject *)np;
#undef b
}

邏輯非常簡單,假設兩個列表 a 和 b 相加,過程如下。

  • 先申請一個新列表,長度為 len(a) + len(b);
  • 將列表 a 的元素拷貝到新列表中;
  • 將列表 b 的元素拷貝到新列表中;

說白了就是兩個 for 循環。

列表的重復

列表可以乘上一個整數,將自身重復指定次數,該過程會返回一個新列表。

print([1, 2, 3] * 3)
"""
[1, 2, 3, 1, 2, 3, 1, 2, 3]
"""

雖然使用了 * 操作符,但它在底層是由 tp_as_sequence.sq_repeat 負責實現的,該字段被賦值為 list_repeat 函數,看一下它的內部邏輯。

// Objects/listobject.c
static PyObject *
list_repeat(PyListObject *a, Py_ssize_t n)
{
    // 獲取 a 指向的列表的長度
    const Py_ssize_t input_size = Py_SIZE(a);
    // 如果列表長度為 0,或者乘上一個小于等于 0 的數
    // 那么創建的新列表的長度依舊是 0,因此直接返回空列表即可
    if (input_size == 0 || n <= 0)
        return PyList_New(0);
    assert(n > 0);
    // 長度有限制,不能超過 PY_SSIZE_T_MAX
    if (input_size > PY_SSIZE_T_MAX / n)
        return PyErr_NoMemory();
    // 新列表的長度
    Py_ssize_t output_size = input_size * n;
    // 為新列表和底層數組申請空間,底層數組的長度為 output_size
    PyListObject *np = (PyListObject *) list_new_prealloc(output_size);
    if (np == NULL)
        return NULL;
    // 指向新列表的底層數組的首元素
    PyObject **dest = np->ob_item;
    // 如果原始列表的長度為 1,比如 a = [1],n = 3
    // 那么新列表就是 [1, 1, 1]
    if (input_size == 1) {
        // 拿到第一個元素
        PyObject *elem = a->ob_item[0];
        // 因為要重復 n 次,所以引用計數增加 n
        _Py_RefcntAdd(elem, n);
        PyObject **dest_end = dest + output_size;
        // 將新列表的底層數組的元素全部設置為 elem
        while (dest < dest_end) {
            *dest++ = elem;
        }
    }
    // 如果原始列表的長度不為 1
    else {
        PyObject **src = a->ob_item;
        PyObject **src_end = src + input_size;
        // 將原始列表的元素依次拷貝到新列表中,但此時只拷貝了 1 次
        while (src < src_end) {
            _Py_RefcntAdd(*src, n);
            *dest++ = *src++;
        }
        // 將新列表里面的元素再重復 output_size / input_size - 1  次
        // 說白了就是再重復 n - 1 次
        _Py_memory_repeat((char *)np->ob_item, 
                          sizeof(PyObject *)*output_size,
                          sizeof(PyObject *)*input_size);
    }
    // 將新列表的 ob_size 設置為 output_size
    Py_SET_SIZE(np, output_size);
    return (PyObject *) np;
}

假設列表 a 和整數 n 相乘,過程如下。

  • 創建一個新列表,長度為 len(a) * n;
  • 將列表 a 的元素拷貝到新列表中;
  • 將新列表的元素再重復 n - 1 次;

基于索引和切片獲取元素

列表可以基于索引和切片截取元素。

data = [1, 2, 3, 4, 5]
print(data[1])  # 2
print(data[1: 4])  # [2, 3, 4]

在底層它由 tp_as_mapping.mp_subscript 實現,該字段被賦值為 list_subscript 函數,看一下它的內部邏輯。

// Objects/listobject.c
static PyObject *
list_subscript(PyListObject* self, PyObject* item)
{   
    // 在基于索引和切片截取時,所有序列型對象的邏輯都差不多
    if (_PyIndex_Check(item)) {
        // 如果 item 是索引,那么轉成 Py_ssize_t 整數
        Py_ssize_t i;
        i = PyNumber_AsSsize_t(item, PyExc_IndexError);
        if (i == -1 && PyErr_Occurred())
            return NULL;
        // 如果 i 小于 0,那么加上列表長度,轉成正數索引
        if (i < 0)
            i += PyList_GET_SIZE(self);
        // 調用 list_item 獲取 ob_item 中索引為 i 的元素
        return list_item(self, i);
    }
    // 如果 item 是切片
    else if (PySlice_Check(item)) {
        // start, stop, step 分別表示起始位置、終止位置、步長
        // slicelength 表示切片截取的長度,也就是要截取多少個元素
        Py_ssize_t start, stop, step, slicelength, i;
        size_t cur;
        PyObject* result;
        PyObject* it;
        PyObject **src, **dest;
        // 獲取切片的 start、stop、step
        if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
            return NULL;
        }
        // 傳入原始列表的長度,對 start 和 stop 進行調整,并返回 slicelength
        slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop,
                                            step);
        // 如果 slicelength <= 0,說明截取不到任何元素
        // 比如 data[5: 1] 或者 data[1: 5: -1],那么直接返回空列表
        if (slicelength <= 0) {
            return PyList_New(0);
        }
        // 如果步長為 1,那么直接將列表中 start 到 stop 之間的元素拷過去即可
        else if (step == 1) {
            return list_slice(self, start, stop);
        }
        // 否則說明步長不為 1
        else {
            // 為創建的新列表和底層數組申請空間
            result = list_new_prealloc(slicelength);
            if (!result) return NULL;
            src = self->ob_item;
            dest = ((PyListObject *)result)->ob_item;
            // 從 start 處開始遍歷,將元素拷貝過去
            // 然后 cur 每次增加 step,遍歷次數為 slicelength
            for (cur = start, i = 0; i < slicelength;
                cur += (size_t)step, i++) {
                it = Py_NewRef(src[cur]);
                dest[i] = it;
            }
            // 將新列表的 ob_size 設置為 slicelength
            Py_SET_SIZE(result, slicelength);
            return result;
        }
    }
    // 否則說明 item 既不是索引也不是切片,那么報錯
    else {
        PyErr_Format(PyExc_TypeError,
                     "list indices must be integers or slices, not %.200s",
                     Py_TYPE(item)->tp_name);
        return NULL;
    }
}

這個和之前介紹的 bytes 對象有點像,因為它們都是序列型對象,在基于索引和切片截取元素時的邏輯也是類似的。

但 bytes 對象只能截取元素,卻不能設置元素,而列表是可以的,因為列表是可變對象。

基于索引和切片設置元素

列表是可變對象,因為它支持設置元素,即對內部元素進行修改。基于索引設置元素就不說了,我們主要看切片,它背后還是有一些復雜的。

data = [1, 2, 3, 4, 5, 6, 7, 8]

# 通過切片設置元素,右值一定是一個可迭代對象
data[0: 3] = [11, 22, 33]
# 會將 data[0] 設置為 11,將 data[1] 設置為 22,將 data[2] 設置為 33
print(data)
"""
[11, 22, 33, 4, 5, 6, 7, 8]
"""

# 而且它們的長度是可以不相等的,這里表示將 [0: 3] 的元素設置為 [1, 2]
# 即 data[0] 設置成 1,data[1] 設置成 2,那么問題來了,data[2] 咋辦?
# 由于右值中已經沒有元素與之匹配了,那么 data[2] 就會被刪掉
data[0: 3] = [1, 2]
print(data)
"""
[1, 2, 4, 5, 6, 7, 8]
"""

# 所以如果想刪除 [0: 3] 的元素,那么只需要執行 data[0: 3] = [] 即可
# 因為 [] 里面沒有元素能與之匹配,所以 data 中 [0: 3] 的位置由于匹配不到
# 那么相當于執行了刪除操作,當然由于 Python 的動態特性,還可以像下面這么做
# data[0: 3] = []、data[0: 3] = ()、data[0: 3] = "" 等等也是沒問題的
data[0: 3] = ""
print(data)
"""
[5, 6, 7, 8]
"""
# 實際上執行 del data[0] 的時候,就是執行了 data[0: 1] = []
# 當然,如果右值元素多的話也是可以的,相當于插入
# 比如這里的 data[0] 匹配 1,然后左邊就結束了
# 于是右側剩余的元素會依次插在后面
data[0: 1] = [1, 2, 3, 4]
print(data)
"""
[1, 2, 3, 4, 6, 7, 8]
"""
# 重點來了,如果切片的步長不等于 1 的話,那么兩邊一定要匹配
# 由于 data[:: 2] 會得到 4 個元素,那么右邊的可迭代對象的長度就必須也是 4
data[:: 2] = ['a', 'b', 'c', 'd']
print(data)
"""
['a', 2, 'b', 4, 'c', 7, 'd']
"""

# 但如果長度不一致,那么會報錯
try:
    data[:: 2] = ['a', 'b', 'c']
except Exception as e:
    # 顯然會報錯
    print(e)  
"""
attempt to assign sequence of size 3 to extended slice of size 4
"""

至于它的源碼有興趣可以自己看一下,在底層它由 tp_as_mapping.mp_ass_subscript 負責實現,該字段被賦值為 list_ass_subscript 函數。邏輯比較長,但不難理解,我們總結一下。

list_subscript 用于獲取元素,list_ass_subscript 用于設置元素。調用這兩個函數,我們即可以傳入索引,也可以傳入切片。

  • 獲取元素時傳入的是索引,那么 list_subscript 內部會調用 list_item,傳入的是切片,那么會調用 list_slice。
  • 設置元素時傳入的是索引,那么 list_ass_subscript 內部會調用 list_ass_item,傳入的是切片,那么會調用 list_ass_slice。并且 list_ass_slice 雖然是設置元素,但刪除元素也是調用的它,比如通過 data[n:n+1]=[] 便可刪除索引為 n 的元素。事實上 remove 和 pop 方法都只是計算出待刪除元素的索引,真正的刪除操作還是通過 list_ass_slice 來執行的。
另外,當傳入切片時,只有步長為 1,才會調用 list_slice 和 list_ass_slice。如果步長不為 1,那么就采用循環的方式逐個遍歷。

小結

以上我們就介紹了列表作為序列型對象擁有的方法,但除了這些它還有很多自定義的方法。

責任編輯:武曉燕 來源: 古明地覺的編程教室
相關推薦

2024-09-10 12:15:24

2024-07-30 10:31:03

2024-08-22 10:11:00

字典取值源碼

2021-11-18 11:48:46

ObjectInputJava

2024-08-08 11:05:22

2022-04-13 14:43:05

JVM同步鎖Monitor 監視

2020-09-11 06:44:29

Python增強算術

2022-08-03 11:00:20

Linux內核

2023-10-24 15:56:23

2024-10-20 13:28:47

虛擬機字節碼CPU

2013-05-07 14:05:53

2020-11-17 14:28:56

數據中心

2023-05-17 15:36:57

2021-07-01 19:35:29

智能電表物聯網智慧城市

2024-12-05 15:44:13

工廠模式接口

2021-12-10 09:35:20

Vim主力編輯器

2013-06-13 10:54:46

iOS7WWDC蘋果

2015-08-06 14:07:16

ChinajoyBAT

2021-03-10 07:20:43

if-else靜態代碼

2021-04-13 06:39:13

代碼重構code
點贊
收藏

51CTO技術棧公眾號

国产欧美精品一区二区三区介绍| 日本天码aⅴ片在线电影网站| 黄视频网站在线观看| 久久婷婷影院| 综合亚洲深深色噜噜狠狠网站| 综合色一区二区| 国产一区二区三区免费看| 亚洲成色777777女色窝| 在线不卡日本| 国产视频久久久久久| 日本视频在线免费观看| 国产午夜精品一区二区三区欧美| 777久久久精品| 亚州欧美一区三区三区在线| 天天综合网久久综合网| 高清一区二区三区| 自拍偷拍欧美精品| 精品国产乱码久久久久| 久草视频免费在线| 日韩视频一二区| 亚洲人成网站在线| 成人福利在线观看| 国产传媒在线看| 欧美大片高清| 91婷婷韩国欧美一区二区| 欧美国产精品日韩| 被黑人猛躁10次高潮视频| a视频网址在线观看| 日韩**一区毛片| 亚洲日本欧美中文幕| 久久美女福利视频| 九色在线免费| 日韩电影不卡一区| 欧美黄色三级| 粉嫩高潮美女一区二区三区 | 香港三级韩国三级日本三级| 国产女人18毛片水18精| 久久一级电影| 欧美裸体一区二区三区| 致1999电视剧免费观看策驰影院| 污污视频在线观看网站| 亚洲精品资源| 亚洲精品视频中文字幕| 欧美精品性生活| 色大18成网站www在线观看| 99久久精品免费看| 国产成人一区二区三区电影| 五月天婷婷丁香网| 国产999精品在线观看| 一卡二卡三卡日韩欧美| 国产精品一区二区三区不卡| 精品人妻一区二区三区免费看| 天天躁日日躁狠狠躁欧美巨大小说 | 亚洲毛片在线观看| 日韩中文字幕二区| 免费在线观看黄色| 丁香另类激情小说| 国产成人欧美在线观看| 亚洲 欧美 视频| 日本久久综合| 精品久久久影院| av视屏在线播放| 国产超级va在线视频| 福利一区福利二区| 99精品国产高清在线观看| 日韩欧美亚洲一区二区三区| 亚洲激情女人| 17婷婷久久www| 国产成人免费观看网站| 手机免费av片| 国产伦子伦对白视频| 捆绑调教一区二区三区| 欧美乱妇40p| 瑟瑟视频在线观看| 国产精品久久免费视频| 欧美高清一级片在线| 午夜免费福利网站| 欧美www.| 欧美群妇大交群中文字幕| 日本www在线视频| 欧美jizz18hd性欧美| 国产精品超碰97尤物18| 精品婷婷色一区二区三区蜜桃| 天天综合在线视频| 国产美女主播视频一区| 亚洲在线观看视频| 免费在线不卡av| 一区二区三区高清视频在线观看| 久久人人爽人人爽爽久久 | 日本一区二区三区中文字幕| 亚洲h动漫在线| 曰韩不卡视频| 欧美野外wwwxxx| 国产精品女上位| 精品伦精品一区二区三区视频| 欧美zzoo| 久久综合精品国产一区二区三区| 亚洲自拍中文字幕| 人妻无码一区二区三区久久99| 黄色日韩网站视频| 国产成人精品日本亚洲| 国产精品久久久久久久成人午夜| 亚洲永久网站| 91chinesevideo永久地址| 欧美超碰在线观看| 久久一区精品| 不卡的av电影在线观看| 亚洲男人av电影| 成人午夜免费影院| 日韩亚洲在线| 91情侣偷在线精品国产| 五月天中文字幕| 国产高清久久久久| 成人自拍性视频| 蜜芽tv福利在线视频| 亚洲精品成人天堂一二三| 特级毛片在线免费观看| 免费在线看黄色| 日韩欧美国产黄色| 欧美黄网站在线观看| 无人区乱码一区二区三区| 一区二区三区视频在线| 亚洲欧美va天堂人熟伦| 国产日产精品一区二区三区四区的观看方式 | 国产精品久久久久久久久免费樱桃| 国产欧美精品aaaaaa片| 182tv在线播放| 一区二区三区四区在线| 欧美性猛交久久久乱大交小说 | 欧美精品久久久久性色| 蜜臀精品一区二区三区在线观看| 国产精品第1页| 国产女主播喷水视频在线观看| 东方aⅴ免费观看久久av| 亚洲一区二区在线看| 国产黄大片在线观看画质优化| 在线欧美小视频| 国产喷水theporn| 日韩久久一区| 一级做a爰片久久毛片美女图片| 日韩高清免费av| 亚久久调教视频| 国产精品推荐精品| 七七成人影院| 精品国产三级a在线观看| 国产中文字幕一区二区| 国产一卡不卡| 日本精品久久久久久久| 91在线观看喷潮| 成人一区二区三区视频| 日韩video| 看黄在线观看| 欧美性生交片4| 免费看的av网站| 天海翼亚洲一区二区三区| 欧美激情视频网| 亚洲精品国产suv一区| 久久久噜噜噜久久人人看 | 国产精品免费网站| 精品久久久免费视频| 99久久国产综合精品色伊| 久久国产精品网| 国产69精品久久久久9999人| 欧美日韩另类一区| 麻豆一区在线观看| 妖精视频成人观看www| 国产伦精品一区二区三区高清| 大黄网站在线观看| 欧美日韩一区二区三区四区| 日韩女优在线视频| 久久在线视频| 国产网红主播福利一区二区| 日韩美女写真福利在线观看| 日本在线视频1区| 国产精品国产三级国产普通话99 | 高端美女服务在线视频播放| 亚洲国产私拍精品国模在线观看| 美国黄色特级片| 麻豆精品精品国产自在97香蕉| 伊人情人网综合| 日韩在线网址| 4438全国成人免费| www.久久久久久久久久| 亚洲国产精品尤物yw在线观看| 天天爽人人爽夜夜爽| 婷婷成人基地| 国产精品免费观看在线| 国内精品久久久久久野外| 欧美性极品少妇精品网站| 国产综合精品在线| 日韩午夜在线| 亚洲一区二区在线看| 91麻豆精品激情在线观看最新| 中文字幕久精品免费视频| www..com国产| 亚洲国产精品成人综合| 日本精品一区二区三区四区| 色婷婷一区二区三区| 国产精品999999| 在线观看的网站你懂的| 日韩电影中文字幕一区| 香蕉视频一区二区| 国产欧美日韩中文久久| 欧美激情国产精品日韩| 国产精品久久久久9999赢消| 国模精品娜娜一二三区| av电影免费在线看| 精品av久久707| 成年人视频免费| 国产日韩高清在线| 26uuu国产| 免费av成人在线| 男人日女人逼逼| 亚洲精品成人无限看| 国产主播喷水一区二区| 国产日本在线观看| 日韩av大片站长工具| 91成人免费电影| 国产主播在线播放| 国产成a人无v码亚洲福利| www.国产区| 伊人久久综合| 国产v亚洲v天堂无码| 日韩激情美女| 在线观看成人黄色| 亚洲欧洲视频在线观看| 日韩欧美一级在线播放| 久久久精品国产sm调教| 成人丝袜高跟foot| 九九九九九国产| 日韩av网站在线观看| 男人日女人下面视频| 中文字幕午夜精品一区二区三区| 日韩一区二区电影在线观看| jizzjizz少妇亚洲水多| 亚洲**2019国产| 黄色av免费在线观看| 亚洲精品在线免费播放| 精品国产伦一区二区三区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲精品一级二级三级| 日韩av男人的天堂| 第一av在线| 欧美激情精品久久久久久蜜臀| 免费超碰在线| 日韩中文字幕网址| 国产精品视频a| 欧美色老头old∨ideo| 五月婷婷激情五月| 欧洲亚洲精品在线| 中文字幕 亚洲视频| 最新成人av在线| 亚洲天堂精品一区| 国产精品久久久久aaaa| 亚洲色图100p| 黄色欧美日韩| 狠狠躁夜夜躁人人躁婷婷91 | 国产成人av影院| 最好看的中文字幕| 国产成人精品亚洲日本在线桃色| 男插女视频网站| 成人avav影音| 亚洲av无码国产精品久久| 欧美aaaaaa午夜精品| 日本在线观看a| 日本欧美韩国一区三区| 99re精彩视频| 国产伦精一区二区三区| 成年人黄色片视频| 日韩va欧美va亚洲va久久| www.激情网| 成人免费看片39| 亚洲一区3d动漫同人无遮挡 | 毛片在线播放视频| 国产日韩1区| 国产自偷自偷免费一区| 精品一区二区免费视频| 欧美成人精品欧美一级乱| 日日摸夜夜添夜夜添国产精品 | 日韩欧美手机在线| 99久久亚洲精品| 日韩黄色短视频| 国产精品黑丝在线播放| 久草免费福利在线| 蜜桃av一区| 欧美精品自拍视频| 久久精品女人| 一二三级黄色片| 男男成人高潮片免费网站| 亚洲一级片av| 99re这里都是精品| 国产精品麻豆一区| 亚洲国产视频a| 国产精品成人无码| 亚洲第一福利在线观看| av影片在线看| 亚洲一级片在线看| 五月婷婷久久久| 自拍偷拍亚洲一区| 爱啪啪综合导航| 国产一区深夜福利| 久久综合另类图片小说| 国模精品一区二区三区| 水蜜桃精品av一区二区| www.av中文字幕| 极品少妇xxxx偷拍精品少妇| 熟女丰满老熟女熟妇| 亚洲免费在线看| 免费一级片视频| 欧美丝袜第三区| 亚洲 美腿 欧美 偷拍| 九色成人免费视频| 国产亚洲精品精品国产亚洲综合| 国产精品老牛影院在线观看 | 久久亚洲高清| 美女网站色精品尤物极品姐弟| 亚洲一区二区在线免费观看| 久久aⅴ国产紧身牛仔裤| 精品无码av一区二区三区不卡| 狠狠色丁香久久婷婷综合丁香| 日本一区二区三区网站| 夜夜爽夜夜爽精品视频| 97超视频在线观看| 亚洲色图五月天| 在线天堂中文资源最新版| 欧美亚州一区二区三区| 欧美精品三级在线| http;//www.99re视频| 欧美在线电影| 欧美激情国产精品日韩| 99免费精品在线| 国产肥白大熟妇bbbb视频| 亚洲高清视频中文字幕| 国产国语亲子伦亲子| 亚洲韩国日本中文字幕| 肉体视频在线| 99在线看视频| 欧美伊人久久| 自慰无码一区二区三区| 懂色av一区二区在线播放| 国产乱国产乱老熟300| 天天色综合天天| 中文字幕日韩免费| 亚洲精品久久久久久久久久久久久 | 国产草草影院ccyycom| 日韩三级影视基地| 欧洲亚洲精品久久久久| 亚洲成人日韩| 97超碰在线人人| www.日韩在线| 日韩av综合在线| 亚洲精品国产精品自产a区红杏吧| 91破解版在线观看| 精品婷婷色一区二区三区蜜桃| 在线视频日韩| 亚洲av无码一区二区三区人| 色呦呦日韩精品| 91女人18毛片水多国产| 色阁综合伊人av| 国产无遮挡裸体视频在线观看| 国产偷久久久精品专区| 亚洲少妇在线| 欧美做受xxxxxⅹ性视频| 在线观看91视频| 久热国产在线| 97超碰人人模人人爽人人看| 经典一区二区| 亚洲最新在线| 韩国毛片一区二区三区| 欧美日韩在线视频免费播放| 精品国产一区二区三区久久久蜜月| 91在线三级| 日本不卡一区| 亚洲东热激情| 90岁老太婆乱淫| 欧美日韩成人一区| 日本电影在线观看| 免费试看一区| 老司机免费视频一区二区| 久久久久久久久久久久久女过产乱| 色哟哟在线观看一区二区三区| 成人av毛片| 91久久国产综合久久蜜月精品| 999亚洲国产精| 国产欧美一区二区三区在线观看视频| 91精品国产91综合久久蜜臀| 国产一区精品| 91亚洲精品久久久久久久久久久久| 国语对白精品一区二区| 久久精品国产亚洲av久| 56国语精品自产拍在线观看| heyzo高清在线| 亚洲一二三区在线| 99久久99久久精品国产片果冻 | 久热re这里精品视频在线6| 四虎永久免费地址| 在线欧美日韩精品| 性欧美1819sex性高清大胸| 蜜桃成人在线| 国产福利一区二区三区在线视频|