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

Python新操作:字典合并操作符來了

開發 后端
今天就想和大家聊聊這個提案,不僅是要了解字典合并操作符的前世今生,更是要學習提案作者以及參與者是如何對引入一個新特性的思考,辯證性地分析利弊,最終確定引入。

一、前言

就在本周,字典合并特性(PEP 584[1])的提交被合入了 CPython 的主干分支,并在 2020-02-26 發布了 Python 3.9.0a4[2] 預覽版本。

那什么是字典合并操作符呢?在回答這個問題前,我們不妨回憶下集合的合并操作。當我們想要對兩個結合做合并操作時,會怎么做呢? 

  1. >>> s1 = {1, 2}  
  2. >>> s2 = {2, 3}  
  3. >>> s1 | s2  # s1 和 s2 取并集,生成新的集合;與 s1.union(s2) 等價  
  4. {1, 2, 3}  
  5. >>> s1 |= s2 # s1 和 s2 取并集,并更新到 s1 上;與 s1.update(s2) 等價  
  6. >>> s1  
  7. {1, 2, 3} 

類似地,我們希望 Python 中的字典能像集合一樣,使用 | 和 |= 作為合并操作符,以解決我們在過去合并字典時感受到的“痛苦”,于是就有了 PEP 584。

今天就想和大家聊聊這個提案,不僅是要了解字典合并操作符的前世今生,更是要學習提案作者以及參與者是如何對引入一個新特性的思考,辯證性地分析利弊,最終確定引入。最后還想和大家分享下在 CPython 層面是如何實現的。

二、背景

在平時使用 Python 的過程中,我們有時會需要合并字典。目前合并字典有多種方式,它們或多或少都有些缺點。

2.1 dict.update

d1.update(d2) 確實能合并兩個字典,但它是在修改d1的基礎上進行。如果我們想要合并成一個新的字典,沒有一個直接使用表達式的方式,而需要借助臨時變量進行: 

  1. e = d1.copy()  
  2. e.update(d2) 

2.2 {**d1, **d2}

字典解包可以將兩個字典合并為一個新的字典,但看起來有些丑陋,并且不能讓人顯而易見地看出這是在合并字典。

{**d1, **d2} 還會忽略映射類型,并始終返回字典類型。

2.3 collections.ChainMap

ChainMap 很少有人知道,它也可以用作合并字典。但和前面合并方式相反,在合并兩個字典時,第一個字典的鍵會覆蓋第二個字典的相同鍵。

此外,由于 ChainMap 是對入參字典的封裝,這意味著寫入 ChainMap 會修改原始字典: 

  1. >>> from collections import ChainMap  
  2. >>> d1 = {'a':1}  
  3. >>> d2 = {'a':2}  
  4. >>> merged = ChainMap(d1, d2)  
  5. >>> merged['a']     # d1['a'] 會覆蓋 d2['a']  
  6.  
  7. >>> merged['a'] = 3 # 實際等同于 d1['a'] = 3  
  8. >>> d1  
  9. {'a': 3} 

2.4 dict(d1, **d2)

這是一種鮮為人知的合并字典的“巧妙方法”,但如果字典的鍵不是字符串,它就不能有效工作了: 

  1. >>> d1 = {'a': 1}  
  2. >>> d2 = {2: 2}  
  3. >>> dict(d1, **d2)  
  4. Traceback (most recent call last):  
  5.   ...  
  6. TypeError: keywords must be strings 

三、原理

新操作符同 dict.update 方法的關系,就和列表連接(+)、擴展(+=)操作符同 list.extend 方法的關系一樣。需要注意的是,這和集合中 |/|= 操作符同 set.update 的關系稍有不同。作者明確了允許就地運算符接受更廣泛的類型(就像 list 那樣)是一種更有用的設計,并且限制二進制操作符的操作數類型(就像 list 那樣)將有助于避免由復雜的隱式類型轉換引起的錯誤被吞掉。 

  1. >>> l1 = [1, 2]  
  2. >>> l1 + (3,) # 限制操作數的類型,不是列表就報錯  
  3. Traceback (most recent call last)  
  4. ...  
  5. TypeError: can only concatenate list (not "tuple") to list  
  6. >>> l1 += (3,) # 允許就地運算符接受更廣泛的類型(如元組)  
  7. >>> l1  
  8. [1, 2, 3] 

當合并字典發生鍵沖突時,以最右邊的值為準。這和現存的字典類似操作相符,比如: 

  1. {'a': 1, 'a': 2} # 2 覆蓋 1  
  2. {**d, **e}       # e覆蓋d中相同鍵所對應的值  
  3. d.update(e)      # e覆蓋d中相同鍵所對應的值  
  4. d[k] = v         # v 覆蓋原有值  
  5. {k: v for x in (d, e) for (k, v) in x.items()} # e覆蓋d中相同鍵所對應的值 

四、規范

字典合并會返回一個新字典,該字典由左操作數與右操作數合并而成,每個操作數必須是 dict(或 dict 子類的實例)。如果兩個操作數中都出現一個鍵,則最后出現的值(即來自右側操作數的值)將會覆蓋: 

  1. >>> d = {'spam': 1, 'eggs': 2, 'cheese': 3}  
  2. >>> e = {'cheese': 'cheddar', 'aardvark': 'Ethel'}  
  3. >>> d | e  
  4. {'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}  
  5. >>> e | d # 不符合交換律,左右互換操作數會得到不同的結果  
  6. {'aardvark': 'Ethel', 'spam': 1, 'eggs': 2, 'cheese': 3} 

擴展賦值版本的就地操作: 

  1. >>> d |= e # 將 e 更新到 d 中  
  2. >>> d  
  3. {'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'} 

擴展賦值的行為和字典的 update 方法完全一樣,它還支持任何實現了映射協議(更確切地說是實現了 keys 和 __getitem__ 方法)或鍵值對迭代對象。所以: 

  1. >>> d | [('spam', 999)]   # “原理”章節中提到限制操作數的類型,不是字典或字典子類就報錯  
  2. Traceback (most recent call last):  
  3.   ...  
  4. TypeError: can only merge dict (not "list") to dict   
  5. >>> d |= [('spam', 999)]  # “原理”章節中提到允許就地運算符接受更廣泛的類型,其行為和 update 一樣,接受鍵值對迭代對象  
  6. >>> d 
  7.  {'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel', 'spam': 999} 

五、主流觀點

5.1 字典合并不符合交換律

合并是符合交換律的,但是字典聯合卻沒有(d | e != e | d)。

回應

Python 中有過不符合交換律的合并先例: 

  1. >>> {0} | {False}  
  2. {0}  
  3. >>> {False} | {0}  
  4. {False} 

上述結果雖然是相等的,但是本質是不同的。通常來說,a | b 和 b | a 并不相同。

5.2 字典合并并不高效

類似管道寫法使用多次字典合并并不高效,比如 d | e | f | g | h 會創建和銷毀三個臨時映射。

回應

這種問題在序列級聯時同樣會出現。

序列級聯的每一次合并都會使序列中的元素總數增加,最終會帶來 O(N^2) 的性能開銷。而字典合并有可能會有重復鍵,因此臨時映射的大小并不會如此快速地增長。

正如我們很少將大量的列表或元組連接在一起一樣,PEP的作者任務合并大量的字典也是少見情況。若是確實有這樣的訴求,那么最好使用顯式的循環和就地合并: 

  1. new = {}  
  2. for d in many_dicts:  
  3.     new |= d 

5.3 字典合并是有損的

字典合并可能會丟失數據(相同鍵的值可能消失),其他形式的合并并不會。

回應

作者并不覺得這種有損是一個問題。此外,dict.update 也會發生這種情況,但并不會丟棄鍵,這其實是符合預期的。只不過是現在使用的不是 update 而是 |。

如果從不可逆的角度考慮,其他類型的合并也是有損的。假設 a | b 的結果是365,那么 a 和 b 是多少卻不得而知。

5.4 只有一種方法達到目的

字典合并不符合“Only One Way”的禪宗。

回應

其實并沒有這樣的禪宗。“Only One Way”起源于很早之前Perl社區對Python的誹謗。

5.5 超過一種方法達到目的

好吧,禪宗并沒有說“Only One Way To Do It”。但是它明確禁止“超過一種方法達到目的”。

回應

并沒有這樣的禁止。Python 之禪僅表達了對“僅一種顯而易見的方式”的偏愛。 

  1. There should be one-- and preferably only one --obvious way to do  
  2. it. 

它的重點是應該有一種明顯的方式達到目的。對于字典更新操作來說,我們可能希望至少執行兩個不同的操作:

  •  就地更新字典:顯而易見的方式是使用 update() 方法。如果此提案被接受,|= 擴展賦值操作符也將等效,但這是擴展賦值如何定義的副作用。選擇哪種取決于使用者口味。
  •  合并兩個現存的字典到新字典中:此提案中顯而易見的方法是使用 | 合并操作符。

實際上,Python 里經常違反對“僅一種方式”的偏愛。例如,每個 for 循環都可以重寫為 while 循環;每個 if 塊都可以寫為 if/else 塊。列表、集合和字典推導都可以用生成器表達式代替。列表提供了不少于五種方法來實現級聯:

  •  級聯操作符:a + b
  •  就地級聯操作符:a + = b
  •  切片分配:a[len(a):] = b
  •  序列解壓縮:[*a, *b]
  •  擴展方法:a.extend(b)

我們不能太教條主義,不能因為它違反了“僅一種方式”就非常嚴格的拒絕有用的功能。

5.6 字典合并讓代碼更難理解

字典合并讓人們更難理解代碼的含義。為了解釋該異議,而不是具體引用任何人的話:“在看到 spam | eggs,如果不知道 spam 和 eggs 是什么,根本就不知道這個表達式的作用”。

回應

這確實如此,即使沒有該提案,| 操作符的現狀也是如此:

  •  對于 int/bool 是按位或
  •  對于 set/forzenset 是并集
  •  還可能是任何其他的重載操作

添加字典合并看起來并不會讓理解代碼變得更困難。確定 spam 和 eggs 是映射類型并不比確定是集合還是整數要花更多的工作。其實良好的命名約定將會有助于改善情況: 

  1. flags |= WRITEABLE  # 可能就是數字的按位或  
  2. DO_NOT_RUN = WEEKENDS | HOLIDAYS  # 可能就是集合合并  
  3. settings = DEFAULT_SETTINGS | user_settings | workspace_settings  # 可能就是字典合并 

5.7 參考下完整的集合API

字典和集合很相似,應該要支持集合所支持的操作符:|、&、^ 和 -。

回應

也許后續會有PEP來專門說明這些操作符如何用于字典。簡單來說:

把集合的對稱差集(^)操作用在字典上面是顯而易見且自然。比如: 

  1. >>> d1 = {"spam": 1, "eggs": 2}  
  2. >>> d2 = {"ham": 3, "eggs": 4} 

對于 d1 和 d2 對稱差集,我們期望 d1 ^ d2 應該是 {"spam": 1, "ham": 3}

把集合的差集(-)操作用在字典上面也是顯而易見和自然的。比如 d1 和 d2 的差集,我們期望:

  •  d1 - d2 為 {"spam": 1}
  •  d2 - d1 為 {"ham": 3}

把集合的交集(&)操作用在字典上面就有些問題了。雖然很容易確定兩個字典中鍵的交集,但是如何處理鍵所對應的值就比較模糊。不難看出 d1 和 d2 的共同鍵是 eggs,如果我們遵循“后者勝出”的一致性原則,那么值就是 4。

六、已拒絕的觀點

PEP 584 提案中羅列了很多已拒絕的觀點,比如使用 + 來合并字典;在合并字典時也合并值類型為列表的值等等。這些觀點都非常有意思,被拒絕的理由也同樣有說服力。限于篇幅的原因不再進一步展開,感興趣的可以閱讀 https://www.python.org/dev/peps/pep-0584/#id34。

七、實現

7.1 純 Python 實現 

  1. def __or__(self, other):  
  2.     if not isinstance(other, dict):  
  3.         return NotImplemented  
  4.     new = dict(self)  
  5.     new.update(other)  
  6.     return new  
  7. def __ror__(self, other):  
  8.     if not isinstance(other, dict):  
  9.         return NotImplemented  
  10.     new = dict(other)  
  11.     new.update(self)  
  12.     return new  
  13. def __ior__(self, other):  
  14.     dict.update(self, other)  
  15.     return self 

純 Python 實現并不復雜,我們只需讓 dict 實現幾個魔法方法:

    __or__ 和 __ror__ 魔法方法對應于 | 操作符,__or__ 表示對象在操作符左側,__ror__ 表示對象在操作符右側。實現就是根據左側操作數生成一個新字典,再把右側操作數更新到新字典中,并返回新字典。

    __ior__ 魔法方法對應于 |= 操作符,將右側操作數更新到自身即可。

7.2 CPython 實現

CPython 中字典合并的詳細實現可見此 PR:https://github.com/python/cpython/pull/12088/files 。

最核心的實現如下: 

  1. // 實現字典合并生成新字典的邏輯,對應于 | 操作符  
  2. static PyObject *  
  3. dict_or(PyObject *self, PyObject *other)  
  4.  
  5.     if (!PyDict_Check(self) || !PyDict_Check(other)) {  
  6.         Py_RETURN_NOTIMPLEMENTED;  
  7.     }  
  8.     PyObject *new = PyDict_Copy(self);  
  9.     if (new == NULL) {  
  10.         return NULL;  
  11.     }  
  12.     if (dict_update_arg(new, other)) {  
  13.         Py_DECREF(new); // 減少引用計數  
  14.         return NULL;  
  15.     }  
  16.     return new;  
  17.  
  18. // 實現字典就地合并邏輯,對應于 |= 操作符  
  19. static PyObject *  
  20. dict_ior(PyObject *self, PyObject *other)  
  21.  
  22.     if (dict_update_arg(self, other)) {  
  23.         return NULL;  
  24.     }  
  25.     Py_INCREF(self); // 增加引用計數  
  26.     return self;  

CPython 的實現邏輯和純Python實現幾乎一樣,唯獨需要注意的就是引用計數的問題,這關系到對象的垃圾回收。

八、總結

PEP 584是一個非常精彩的提案,引入 | 和 |= 操作符用作字典合并,看似是一個比較簡單的功能,但所要考慮的情況卻不少。不僅需要說明這個提案的背景,目前有哪些方式可以達到目的,它們有哪些痛點;還要考慮對既有類型引入操作符所帶來的各種影響,對開發者提出的質疑和顧慮進行思考和解決。整個提案所涉及到的方法論、思考維度、知識點都非常值得學習。

對使用者來說,合并字典將會變得更加方便。在提案的最后,作者給出了許多第三方庫在合并字典時采用新方式編寫的例子,可謂是簡潔了不少。詳見 https://www.python.org/dev/peps/pep-0584/#id50 。 

 

責任編輯:龐桂玉 來源: 戀習Python
相關推薦

2021-10-31 18:59:55

Python操作符用法

2010-07-14 14:55:07

Perl操作符

2009-08-19 17:26:28

C# 操作符

2010-01-28 11:16:28

C++操作符

2010-02-23 11:18:25

Python 操作符

2010-07-19 11:00:24

Perl操作符

2011-04-08 16:26:14

JavaScript

2010-07-14 14:30:31

Perl操作符

2009-07-21 09:31:00

Scala操作符

2009-09-15 17:16:58

LINQ查詢操作符

2009-09-16 09:09:23

Linq Contai

2010-07-14 14:18:51

Perl操作符

2012-02-06 09:13:23

LINQ

2009-08-18 18:06:54

C#操作符重載

2021-10-09 13:48:11

操作符Python運算符

2017-01-03 16:12:13

RxJava操作符Android

2016-12-28 09:54:50

AndroidRxJava操作符

2010-07-13 11:11:39

Perl標量

2009-11-30 16:48:08

PHP操作符

2009-07-14 18:34:22

Jython操作符重載
點贊
收藏

51CTO技術棧公眾號

日韩免费视频在线观看| 欧美成人一区二区| 在线成人av电影| av网站免费大全| 亚洲伦理精品| 日韩中文字幕精品| 日韩少妇一区二区| 欧亚一区二区| 一区二区三区在线视频免费 | 精品一区二区三区中文字幕在线 | 26uuu久久综合| 成人h视频在线| 国产综合精品视频| 五月开心六月丁香综合色啪| 亚洲精品福利资源站| 日本黄色的视频| 日韩激情电影| 亚洲精品videosex极品| 欧美亚洲爱爱另类综合| www.黄色片| 秋霞成人午夜伦在线观看| 久久久久亚洲精品成人网小说| 欧美激情 一区| 美国成人xxx| 欧美一区二区视频在线观看| 99草草国产熟女视频在线| 欧美卡一卡二| 亚洲天堂免费看| 五月天久久综合网| 天堂а√在线8种子蜜桃视频 | 欧美午夜精品久久久| 久久久久久久久久网| 成人日韩欧美| 亚洲欧洲av在线| 日本一区二区三区四区在线观看 | 亚洲午夜女主播在线直播| 国产又粗又猛又爽又黄| 久久日本片精品aaaaa国产| 色综合天天视频在线观看| www.av片| 91豆花视频在线播放| 一区二区三区在线播| 9999在线观看| 国产视频中文字幕在线观看| 中文字幕欧美区| 日本在线观看一区二区三区| 日本一二三区在线视频| proumb性欧美在线观看| 国产精品日韩一区二区免费视频| 精品国产99久久久久久宅男i| 蜜桃视频一区二区| 国产伦精品一区二区三区精品视频| 中文字幕在线播| 久久精品午夜| 日韩美女福利视频| 欧美brazzers| 秋霞电影一区二区| 国产日韩在线观看av| 中文字幕+乱码+中文乱码www | 三上悠亚 电影| 视频精品二区| 亚洲国产欧美一区| 人妻无码一区二区三区| 香蕉久久夜色精品国产更新时间 | 亚洲精品日韩激情在线电影| 国产草草影院ccyycom| 国产精品一区二区三区四区 | 国产xxxx在线观看| 岛国av在线一区| 精品国产电影| 国产视频第一页在线观看| 国产日韩三级在线| 亚洲精品久久久久久一区二区| 91xxx在线观看| 最新成人av在线| 国产一区二区三区播放| 多野结衣av一区| 色国产精品一区在线观看| 污视频免费在线观看网站| 97色婷婷成人综合在线观看| 精品国产乱码久久久久久图片 | a网站在线观看| 成人黄页在线观看| 天天久久人人| 怡红院红怡院欧美aⅴ怡春院| 亚洲午夜免费福利视频| 成年人免费大片| 国产aa精品| 亚洲精品国精品久久99热 | 日韩激情图片| 欧美放荡办公室videos4k| 97久久久久久久| 看电视剧不卡顿的网站| 国产精品免费在线| av在线电影播放| 亚洲最大的成人av| 美女网站视频黄色| 成人性生交大片免费看96| 亚洲色图18p| 男女性高潮免费网站| 一区二区三区国产在线| 国产一区欧美二区三区| 特黄aaaaaaaaa真人毛片| 亚洲国产精品精华液2区45| 国产1区2区3区中文字幕| 玛雅亚洲电影| 日韩精品一区二| 一二三四国产精品| 99国产精品久久久久久久| 国产精自产拍久久久久久蜜| 天天综合永久入口| 亚洲精品日韩专区silk| 一级特黄性色生活片| 高潮久久久久久久久久久久久久| 中文字幕日韩av电影| 少妇一级淫片免费放中国| 国产在线视视频有精品| 日本精品一区二区| 激情国产在线| 日韩欧美国产高清| 天天做夜夜爱爱爱| 秋霞电影网一区二区| 噜噜噜噜噜久久久久久91| 国产白丝在线观看| 91精品黄色片免费大全| 国产一区二区三区四区在线| 在线一区免费观看| 99九九视频| 国产精品实拍| 欧美日本视频在线| 亚洲国产日韩一区无码精品久久久| 黄色成人91| 99r国产精品视频| 久cao在线| 欧美三级日韩在线| 国产午夜福利一区| 久久久水蜜桃av免费网站| 国产综合av一区二区三区| 免费电影视频在线看| 日韩一区二区三区四区| 国产亚洲精品久久久久久豆腐| 日韩综合小视频| 欧美日产一区二区三区在线观看| 伊人久久视频| 亚洲免费小视频| 天码人妻一区二区三区在线看| 成人午夜av在线| 福利视频一二区| 欧美顶级毛片在线播放| 97人洗澡人人免费公开视频碰碰碰| 懂色av蜜臀av粉嫩av分享吧| 夜夜精品视频一区二区| wwwxxx色| 最新亚洲一区| 蜜桃狠狠色伊人亚洲综合网站| 成人爽a毛片免费啪啪| 亚洲欧美国产另类| 四虎影院在线免费播放| 国产亚洲成aⅴ人片在线观看 | 国产一区二区网址| dy888午夜| 网站一区二区| 97免费中文视频在线观看| 日本中文字幕一区二区有码在线| 色综合咪咪久久| 在线免费观看视频| 极品少妇一区二区三区精品视频 | 国产亚洲精品v| 欧美一二三四五区| 日韩在线激情| 欧美交受高潮1| 日本天堂在线| 欧美日韩国产一区二区三区地区| 日韩三级在线观看视频| 粉嫩av亚洲一区二区图片| 九色在线视频观看| 欧洲美女日日| 99高清视频有精品视频| 岛国av在线网站| 一区二区欧美久久| av一区二区三| 欧美日韩午夜剧场| 成年人看的免费视频| 国产福利一区二区三区视频在线| 男女私大尺度视频| 国产一卡不卡| 91在线视频导航| 丝袜诱惑一区二区| 久久精品中文字幕免费mv| 黄色片网站免费在线观看| 色网站国产精品| 青青操国产视频| 久久久久久99精品| 国产探花一区二区三区| 久久国产一二区| 日本a级片在线观看| 亚洲免费毛片| 97人摸人人澡人人人超一碰| 欧美粗大gay| 九九精品在线观看| 国产高清一级毛片在线不卡| 日韩精品一区二区三区视频播放| 黄色片视频免费| 亚洲黄色录像片| 国产毛片欧美毛片久久久| 成人性生交大片| 爱豆国产剧免费观看大全剧苏畅 | 爽爽爽在线观看| 亚洲欧美网站| 日韩成人三级视频| 久久视频在线| 欧美精品123| 国产精品色呦| 91亚洲精品丁香在线观看| 日韩三区在线| 奇门遁甲1982国语版免费观看高清 | 视频91a欧美| 日韩美女在线观看一区| 高清在线视频不卡| 欧美福利小视频| 久久黄色美女电影| 中文字幕精品一区二区精品| 男人的天堂在线免费视频| 精品国产乱码久久久久久图片| 国产一区二区三区中文字幕| 91久久国产最好的精华液| 日韩欧美三级在线观看| 亚洲一区二区在线观看视频| 91久久国产综合| 国产精品久久久久影院色老大 | 国内精品美女av在线播放| 91蜜桃在线视频| 久久亚洲成人精品| 免费黄色在线网站| 日韩在线观看免费网站 | 欧美一级黄视频| 色偷偷成人一区二区三区91| 国产a∨精品一区二区三区仙踪林| 亚洲影视在线观看| av资源吧首页| 亚洲二区在线视频| 日韩激情在线播放| 午夜电影久久久| 欧美激情亚洲综合| 午夜免费久久看| 狠狠躁夜夜躁人人爽天天高潮| 亚洲成va人在线观看| 国产在线精品观看| 精品福利免费观看| 日本免费在线观看视频| 日本黄色一区二区| 久久国产香蕉视频| 欧美群妇大交群的观看方式| 国产免费不卡视频| 日韩一本二本av| 黄色福利在线观看| 日韩精品中文字幕视频在线| 国产天堂在线| 久久久精品免费| 俄罗斯一级**毛片在线播放| 91精品国产高清| 欧美成人资源| 成人免费高清完整版在线观看| vam成人资源在线观看| 成人av片网址| 日韩欧美中文字幕电影| 日本公妇乱淫免费视频一区三区| 久久精品av| 污污污污污污www网站免费| 亚洲高清网站| 激情网站五月天| 美女任你摸久久| 中国特级黄色片| 99久久精品久久久久久清纯| 在线小视频你懂的| 一区二区三区在线影院| 亚洲免费黄色网址| 欧美日韩成人在线一区| 狠狠人妻久久久久久综合麻豆| 亚洲精品久久久久久下一站| 草碰在线视频| 久久久亚洲精品视频| 四虎成人在线| 成人av蜜桃| 国模精品一区| 91.com在线| 麻豆一区二区在线| 亚洲婷婷在线观看| 国产精品久久久一本精品 | 欧美影片第一页| 成人黄色在线观看视频| 亚洲一级一级97网| 狂野欧美性猛交xxxxx视频| 国产福利精品av综合导导航| 99re8这里有精品热视频免费| 日本午夜精品一区二区三区| 国内精品福利| 男女午夜激情视频| 国产精品香蕉一区二区三区| 婷婷色一区二区三区| 一区二区三区四区在线免费观看| 波多野结衣家庭主妇| 亚洲第一免费播放区| 尤物网在线观看| 国产91精品青草社区| av在线亚洲一区| 欧美一区三区二区在线观看| 欧美先锋影音| 午夜一级免费视频| 国产日韩综合av| 草久久免费视频| 日韩欧美另类在线| 黄视频网站在线| 国产精品极品尤物在线观看 | 亚洲午夜小视频| 污视频免费在线观看| 国产欧美日韩视频| 国产99精品一区| 日本在线xxx| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日本国产中文字幕| 精品亚洲免费视频| 中文字幕免费在线看线人动作大片| 红桃视频成人在线观看| 国内精品偷拍视频| 久久天天躁狠狠躁老女人| 99riav视频一区二区| 欧美日韩一区二区三区在线观看免| 在线精品在线| 亚洲婷婷在线观看| 亚洲a一区二区| 国精产品一品二品国精品69xx| 久热爱精品视频线路一| 在线视频成人| 中文字幕久久一区| 激情综合网av| 精品亚洲乱码一区二区| 欧美色视频在线观看| av网站大全在线观看| 国产精品jizz在线观看麻豆| 美女久久久久| 成人在线观看a| 欧美激情综合网| 中文字幕免费观看视频| 尤物tv国产一区| 欧美成人家庭影院| 正在播放一区二区三区| 精品一区二区久久| 丝袜美腿小色网| 欧美mv日韩mv亚洲| 1区2区在线| 免费电影一区| 日韩电影在线观看电影| 国产午夜精品福利视频| 欧美日韩在线综合| 高潮毛片在线观看| 999国产在线| 亚洲精品字幕| 欧洲av一区二区三区| 欧美日韩一区二区不卡| 成人在线观看免费网站| 国产精品 日韩| 性欧美精品高清| 欧美另类69xxxx| 日韩一区二区三区在线观看| av免费不卡国产观看| 日本精品一区二区三区视频| 免费久久99精品国产| 国产大片免费看| 亚洲成av人乱码色午夜| 中文字幕成在线观看| 亚洲不卡1区| 久久99久久99| 日本一区二区免费在线观看| 亚洲少妇激情视频| 精品国产鲁一鲁****| 精品久久久久久久久久中文字幕| 国产亚洲精品久| 国产不卡av在线播放| 情事1991在线| 欧美一区免费| 国产精品无码久久久久久| 正在播放亚洲一区| 啊啊啊久久久| 一本一道久久久a久久久精品91 | 91手机在线观看| 亚洲在线网站| av成人免费网站| 国产手机视频精品| 9999在线精品视频| 国产成人久久婷婷精品流白浆| 国产精品福利在线播放| 天天干天天草天天射| 国产精品自在线| 国产农村妇女精品一区二区| 久久国产精品国语对白| 亚洲美女免费精品视频在线观看| 国产欧美88| www.99av.com| 精品成人国产在线观看男人呻吟|