[英]Priority of tuple (un)packing with inline if-else
提前為晦澀的標題道歉。 我不確定如何描述我遇到的情況。
想象一下,您在變量title_author
中有一本書的標題和作者,用-
分隔。 您從 web 中抓取了此信息,因此很可能該項目為None
。 顯然你想把標題和作者分開,所以你會使用 split。 但是如果title_author
一開始是 None ,你只需要title
和author
都是None
。
我認為以下是一個很好的方法:
title_author = "In Search of Lost Time - Marcel Proust"
title, author = title_author.split("-", 1) if title_author else None, None
print(title, author)
# ['In Search of Lost Time ', ' Marcel Proust'] None
但令我驚訝的是, title
now 是拆分的結果,而author
是None
。 解決方案是通過括號的方式顯式表明else 子句是一個元組。
title, author = title_author.split("-", 1) if title_author else (None, None)
print(title, author)
# In Search of Lost Time Marcel Proust
那么為什么會這樣呢? 導致第一種情況的結果的執行順序是什么?
title, author = title_author.split("-", 1) if title_author else None, None
是相同的:
title, author = (title_author.split("-", 1) if title_author else None), None
因此, author
始終為None
解釋:
來自官方文檔
賦值語句計算表達式列表(請記住,這可以是單個表達式或逗號分隔的列表,后者產生一個元組)並將單個結果 object 從左到右分配給每個目標列表。
也就是說,中斷器將查找(x,y)=(a,b)
並將值分配為x=a
和y=b
。
在您的情況下,有兩種解釋,主要區別在於:
title, author = (title_author.split("-", 1) if title_author else None), None
將兩個值(一個列表或一個 None 和一個 None)分配給兩個變量,不需要解包。
title, author = title_author.split("-", 1) if title_author else (None, None)
實際上是將一個值(列表或元組)分配給兩個變量,這需要一個解包步驟 map 兩個變量到兩個列表/元組中的值。
由於選項1無需拆包即可完成,即操作較少,因此滅弧室將go與選項1無明確說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.