我碰到這段代碼,我想知道這意味着什麼:Python變量聲明
typ, dat = imap_conn.search(None, search_string)
究竟是什麼線的typ, dat
部分是什麼意思?
我碰到這段代碼,我想知道這意味着什麼:Python變量聲明
typ, dat = imap_conn.search(None, search_string)
究竟是什麼線的typ, dat
部分是什麼意思?
這是元組拆包,見Python documentation。如果你的函數返回一個元組,你可以使用類似於a, b = func()
的語法來解壓縮它。
此外,您可以使用元組,如a, b = b, a
可用於交換兩個值。
typ, dat
是一個元組。當在賦值a, b = x
的左側用它等同於:
a = x[0]
b = x[1]
在你的榜樣,typ, dat = imap_conn.search(None, search_string)
相當於:
search_res = imap_conn.search(None, search_string)
typ = search_res[0]
dat = search_res[1]
在左側寫一個元組的這種技術的任務被稱爲元組解包。
並且分配同時完成。 –
@Jeff如何同時完成作業?它將按順序完成。 –
「同時」在這裏可能是錯誤的詞。我不確定究竟是什麼。這意味着要對如何進行交換進行評論。 –
typ, dat = imap_conn.search(None, search_string)
右側的表達式返回兩個值,這兩個值分配給左側的兩個變量。
爲什麼反對投票? :s –
編輯,我的道歉。 –
取決於搜索返回的內容。您可以使用該語法解壓縮結果。因此,例如:
>>>x, y = (1,2)
>>>x
1
>>>y
2
>>> x, y =[(1,2), [1,2,3,(1,2)]]
>>> x
(1, 2)
>>> y
[1, 2, 3, (1, 2)]
在Python中,您可以分配和/或返回多個值,按照下面的代碼:
def fn():
return (7, 2)
(seven, two) = fn()
print seven
print two
print fn()
此輸出:
7
2
(7, 2)
我我更喜歡顯式元組語法(帶圓括號的語法),因爲我相信它使意圖更清晰。
這就是所謂的「解包」,我相信imap_conn.search(None, search_string
方法返回2個值(可能是一個元組),這個表示法允許你可以將它們分配給2個變量一次。
return_val = imap_conn.search(None, search_string)
typ = return_val[0]
dat = return_val[1]
用於分配的語法在http://docs.python.org/reference/simple_stmts.html#assignment-statements
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
target_list ::= target ("," target)* [","]
target ::= identifier
| "(" target_list ")"
| "[" target_list "]"
| attributeref
| subscription
| slicing
給定的分配的左手側含有被逗號分隔的目標的一個或多個target_list
:
到這是等價的。然後將右側的序列解壓到每個目標中。請注意,定義是遞歸的,所以你甚至可以做這樣的事情:
a, [b, c, [d, e]], f = 1, (2, 3, (4, 5)), 6
,但在每一個級別的元素的數量和嵌套必須匹配。如果您使用的是Python 3,則可以選擇將*target
包含在target_list中,並且會吞下可變數量的參數。
並且交換方式實際上比使用臨時值交換更快。 – agf