2011-08-11 231 views
0

我碰到這段代碼,我想知道這意味着什麼:Python變量聲明

typ, dat = imap_conn.search(None, search_string) 

究竟是什麼線的typ, dat部分是什麼意思?

回答

7

這是元組拆包,見Python documentation。如果你的函數返回一個元組,你可以使用類似於a, b = func()的語法來解壓縮它。

此外,您可以使用元組,如a, b = b, a可用於交換兩個值。

+0

並且交換方式實際上比使用臨時值交換更快。 – agf

3

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] 

在左側寫一個元組的這種技術的任務被稱爲元組解包。

+0

並且分配同時完成。 –

+0

@Jeff如何同時完成作業?它將按順序完成。 –

+0

「同時」在這裏可能是錯誤的詞。我不確定究竟是什麼。這意味着要對如何進行交換進行評論。 –

0
typ, dat = imap_conn.search(None, search_string) 

右側的表達式返回兩個值,這兩個值分配給左側的兩個變量。

+0

爲什麼反對投票? :s –

+1

編輯,我的道歉。 –

0

取決於搜索返回的內容。您可以使用該語法解壓縮結果。因此,例如:

>>>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)] 
2

在Python中,您可以分配和/或返回多個值,按照下面的代碼:

def fn(): 
    return (7, 2) 

(seven, two) = fn() 
print seven 
print two 
print fn() 

此輸出:

7 
2 
(7, 2) 

我我更喜歡顯式元組語法(帶圓括號的語法),因爲我相信它使意圖更清晰。

0

這就是所謂的「解包」,我相信imap_conn.search(None, search_string方法返回2個值(可能是一個元組),這個表示法允許你可以將它們分配給2個變量一次。

return_val = imap_conn.search(None, search_string) 
typ = return_val[0] 
dat = return_val[1] 
0

用於分配的語法在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中,並且會吞下可變數量的參數。