精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产剧情一区在线| 欧美r级电影| 一本久久精品一区二区| 日韩黄色影视| 国产夫绿帽单男3p精品视频| 亚洲成人资源| 一本大道亚洲视频| 天天爽夜夜爽视频| 亚洲啊v在线| 一区在线观看免费| 国产专区一区二区| 亚洲最大成人在线视频| 亚洲国产一区二区精品专区| 在线观看国产精品91| 日韩大尺度视频| 先锋欧美三级| 亚洲国产精品一区二区www | 伊人22222| 亚洲午夜黄色| 日韩视频精品在线| 亚洲一区二区观看| 精品网站999| 91久久香蕉国产日韩欧美9色| 日本大胆人体视频| 98在线视频| 99久久国产综合精品女不卡| 成人激情春色网| 久久久久久久久久成人| 国内精品久久久久久久影视蜜臀| 中文字幕日韩电影| 色噜噜在线观看| 日韩精品一级| 欧美丰满美乳xxx高潮www| 日韩欧美一区三区| 青草视频在线免费直播| 中文字幕av一区二区三区| 久99久在线| 六月丁香色婷婷| 国产精品69久久久久水密桃| 国产日产欧美a一级在线| 国产www在线| 国产精品视频久久一区| 久久久久久久久久国产| 欧美黑人性猛交xxx| 999久久久国产精品| 亚洲视频在线看| 国产精品九九九九九| 欧美成人午夜77777| 欧美一级二级在线观看| 又色又爽又黄视频| 国产精品一区二区免费福利视频 | 亚洲无码精品国产| 日本欧美在线观看| 国产福利成人在线| 人人爽人人爽人人片av| 国产欧美一级| 日本一区二区在线播放| 在线观看黄网站| 国产欧美日韩一级| 97在线看福利| 国产午夜精品一区二区理论影院| 午夜精品免费| 欧美尺度大的性做爰视频| 欧美一级片在线视频| 综合久久一区| 欧美激情a在线| 国产精品不卡av| 亚洲黄色大片| 日本免费久久高清视频| 欧美一级淫片免费视频黄| 亚洲免费综合| 国产精品国产亚洲伊人久久 | 视频一区视频二区中文字幕| 国产成人jvid在线播放| 亚洲熟妇无码久久精品| 国产在线精品一区在线观看麻豆| 91丨九色丨国产在线| 亚洲av无码乱码在线观看性色| 高清久久久久久| 国产一区自拍视频| 国产区视频在线播放| 97精品人妻一区二区三区香蕉| 国产无遮挡裸体免费久久| 亚洲高清福利视频| 熟女俱乐部一区二区视频在线| 精品久久成人| 蜜臀久久99精品久久久无需会员 | 欧美偷拍一区二区| 日本一二三四区视频| 国产精品美女在线观看直播| 亚洲片国产一区一级在线观看| 亚洲色图欧美色| 欧美喷水视频| 欧美在线视频观看免费网站| 中文字幕一区二区三区人妻四季| 国产精品一区二区男女羞羞无遮挡| 国产成人看片| 国产中文字幕在线观看| 亚洲欧美日韩综合aⅴ视频| 国产av天堂无码一区二区三区| 影视一区二区三区| 欧美刺激脚交jootjob| 久操视频免费看| 欧美精品一卡| 国产精品免费看久久久香蕉| 亚洲精品国产精品国| 欧美激情综合在线| 免费一级特黄特色毛片久久看| 国产成人精品一区二区三区在线| 精品国内二区三区| 激情高潮到大叫狂喷水| 一区二区三区国产盗摄| 成人在线免费观看视视频| 视频一区二区三区国产| 一区二区三区四区激情| 99久久国产宗和精品1上映| 视频精品一区二区三区| 伊人伊成久久人综合网小说| 国产在线观看免费视频今夜| 极品尤物av久久免费看| 欧美男人的天堂| 污污网站在线看| 欧美在线观看禁18| 特级西西人体4444xxxx| 亚洲欧美伊人| 成人性生交大片免费观看嘿嘿视频| 天堂а在线中文在线无限看推荐| 亚洲精品水蜜桃| 日本久久久久久久久久久久| 香蕉人人精品| 992tv成人免费影院| 99热这里只有精品99| 日本一区二区视频在线| 999香蕉视频| 午夜先锋成人动漫在线| 欧美日韩国产成人高清视频| 国产一区二区女内射| 亚洲国产高清在线观看视频| 777av视频| 国产精品18hdxxxⅹ在线| 欧美成人免费视频| 97精品人妻一区二区三区香蕉| 国产欧美精品一区二区三区四区 | 99热99这里只有精品| 乱人伦精品视频在线观看| 国产欧美一区二区视频 | 人人狠狠综合久久亚洲婷| 欧美中在线观看| 色吊丝在线永久观看最新版本| 一级女性全黄久久生活片免费| 手机av在线网站| 91成人免费| 亚洲精品欧美日韩| av毛片在线播放| 欧美日韩国产片| 三上悠亚在线观看视频| 久久99九九99精品| 日韩人妻精品一区二区三区| 伊人久久大香| 欧美大片免费看| 亚洲奶汁xxxx哺乳期| 亚洲国产成人91porn| 欧类av怡春院| 老鸭窝亚洲一区二区三区| 日韩电影免费观看在| 日本一区二区三区视频在线| 中文字幕亚洲图片| 国产视频在线观看免费| 国产精品久久久久久久久免费丝袜| 少妇网站在线观看| 女主播福利一区| 国产精品二区三区| 一二三四视频在线中文| 一区二区三区动漫| 国产精品欧美久久久久天天影视| 亚洲男同1069视频| 国产69视频在线观看| 欧美亚洲免费| 一本色道久久综合亚洲精品婷婷 | 欧美一级片免费看| 日本一级淫片免费放| 国产午夜精品一区二区| 亚洲天堂网站在线| 国产日韩视频| 亚洲一卡二卡三卡四卡无卡网站在线看| 精品三级国产| 91成人福利在线| 午夜免费视频在线国产| 精品剧情在线观看| 国产午夜麻豆影院在线观看| 国产精品国产三级国产aⅴ原创| 黄页网站在线看| 老妇喷水一区二区三区| 黄色一级视频播放| 伊人成综合网伊人222| 成人精品视频在线| 人人草在线视频| 日韩视频欧美视频| 日夜干在线视频| 91精品国产综合久久精品图片| 日韩三级小视频| 1区2区3区精品视频| 特级西西人体wwwww| 国产剧情av麻豆香蕉精品| 茄子视频成人免费观看| 亚洲综合色站| 五月天色一区| 欧美日韩一本| 91网免费观看| 亚洲精品伦理| 欧美在线观看网址综合| 曰本三级在线| 日韩中文字在线| 青青草免费观看免费视频在线| 3d动漫精品啪啪一区二区竹菊| 久久久久久久极品| 亚洲精品国产一区二区三区四区在线| 精品久久久久久一区| 色哟哟一一国产精品| 高清不卡一二三区| 日韩av一卡二卡三卡| 午夜在线一区| 男人添女人下部高潮视频在观看| 婷婷综合视频| 亚洲二区自拍| 欧美午夜精品一区二区三区电影| 精品久久中出| 久久365资源| 国产成人亚洲欧美| 日韩精品免费视频一区二区三区 | 国产女人aaa级久久久级| 亚洲国产精品无码久久久久高潮 | 欧美撒尿777hd撒尿| 久久精品国产成人av| 亚洲成a人在线观看| wwwav国产| 亚洲欧美成人一区二区三区| 性爱在线免费视频| 国产欧美一二三区| 扒开jk护士狂揉免费| 91丝袜美腿高跟国产极品老师| 国产伦精品一区二区三区妓女下载| 久国产精品韩国三级视频| 亚洲欧美在线精品| 麻豆精品一区二区av白丝在线| www黄色在线| 免费看精品久久片| 日韩不卡一二三| 九色porny丨国产精品| 亚洲免费成人在线视频| 精品一区二区三区免费播放| 在线黄色免费观看| 精品一区二区免费视频| 色婷婷激情视频| 国产黄色91视频| 日韩黄色一区二区| av一区二区三区黑人| 国产精品久久久久久久无码| 99久久久精品免费观看国产蜜| 久久久久成人精品无码中文字幕| 91在线观看高清| 中文字幕一区二区三区人妻| 久久久精品一品道一区| 五月天精品在线| 亚洲人精品午夜| 国产精品suv一区二区69| 欧美性猛交丰臀xxxxx网站| 日本中文字幕第一页| 欧美曰成人黄网| 97人妻精品一区二区三区软件 | 日韩精品四区| 久久久久亚洲av无码专区喷水| 国产中文一区| 能在线观看的av| 蜜臀av一区二区| 野花视频免费在线观看| 99re视频这里只有精品| 亚洲精品国产熟女久久久| 国产精品久久久久久亚洲毛片| wwwav国产| 日韩人体视频一二区| 一级片在线免费观看视频| 日韩精品一区二区三区在线观看 | 久久久久国色av免费看影院| 后入内射无码人妻一区| 一区二区三区国产| 国产亚洲欧美在线精品| 宅男在线国产精品| 视频一区二区免费| 最近更新的2019中文字幕| 很黄的网站在线观看| 97视频在线免费观看| 六九午夜精品视频| 国产伦精品一区二区三区照片91| gogogo高清在线观看一区二区| 黄网站色视频免费观看| 免费在线观看精品| 少妇激情一区二区三区视频| 中文av一区二区| 圆产精品久久久久久久久久久| 欧美天堂一区二区三区| 视频一区二区免费| 免费97视频在线精品国自产拍| 伊人久久国产| 动漫精品视频| 99久久国产综合精品成人影院| 黄色免费视频大全| 国产精品亚洲成人| www中文在线| 欧美午夜精品久久久久久人妖| 国产日韩欧美一区二区东京热| 亚洲欧美在线免费观看| 伊人精品影院| 国产精品中文久久久久久久| 香蕉久久夜色精品国产使用方法| 精品视频在线观看一区二区| 日韩av午夜在线观看| 三级黄色片网站| 一区二区日韩av| 91tv国产成人福利| 一区二区三区久久精品| 国产高潮在线| 成人在线看片| 欧美三级在线| 亚洲综合在线一区二区| 中文字幕一区三区| 在线播放精品视频| 亚洲片在线观看| 成人性生交大片免费网站| 国产精品jizz视频| 精品96久久久久久中文字幕无| 日本中文字幕二区| 国产精品久久久久久久久果冻传媒 | 成人情趣视频网站| 无遮挡又爽又刺激的视频 | 精品综合在线| 亚洲欧洲一区| 成年人小视频在线观看| 怡红院av一区二区三区| 99热精品在线播放| 久久综合免费视频| 成人影院网站ww555久久精品| 午夜一区二区三视频在线观看| 三级久久三级久久久| 亚洲自拍偷拍一区二区| 一本色道久久综合亚洲精品按摩| 免费成人av电影| 国产精品1234| 日本高清免费电影一区| 一级做a免费视频| 亚洲欧美另类久久久精品| 夜夜嗨av禁果av粉嫩avhd| 久久精品福利视频| 九色精品蝌蚪| 91.com在线| 99国产精品久| 自拍偷拍18p| 日韩中文字幕不卡视频| 91嫩草国产线观看亚洲一区二区| 一级黄色录像免费看| 国产一区二三区好的| 国产性一乱一性一伧一色| 精品电影一区二区| 在线观看的黄色| 亚洲精品一区二区三区蜜桃久| 极品美女销魂一区二区三区| 男的操女的网站| 欧美精品一区二区在线播放| 欧美一级鲁丝片| 亚洲第一导航| 国产成人99久久亚洲综合精品| 久久精品视频9| 亚洲欧美一区二区三区久久| 久久91视频| 久艹在线免费观看| 久久综合中文字幕| 国产又爽又黄又嫩又猛又粗| 久久久久久97| 精品国产中文字幕第一页| 一区二区久久精品| 五月开心婷婷久久| 永久免费av在线| 国产高清一区视频| 免费人成网站在线观看欧美高清| 中文字幕av免费在线观看| 亚洲精品一区二区三区婷婷月| 久久av日韩| 青青青国产在线观看| 欧美国产亚洲另类动漫| xxxx国产精品| 国产精品美女在线观看| 极品中文字幕一区| 国产午夜精品久久久久久久久| 精品日韩在线一区| 亚洲风情在线资源| 国产麻豆电影在线观看| 99久久99久久精品免费观看| 国产在成人精品线拍偷自揄拍| 57pao国产精品一区| 欧美激情综合|