Python变量声明

时间:2011-08-11 08:07:41

标签: python syntax

我遇到了这段代码,我想知道这意味着什么:

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

该行的typ, dat部分究竟是什么意思?

7 个答案:

答案 0 :(得分:7)

这是元组解包,请参阅Python documentation。如果你的函数返回一个元组,你总是可以使用类似于a, b = func()的语法解压缩它。

此外,您可以动态使用元组,例如a, b = b, a可用于交换两个值。

答案 1 :(得分: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]

这种在赋值左侧编写元组的技术称为元组解包。

答案 2 :(得分:2)

在Python中,您可以根据以下代码分配和/或返回多个值:

def fn ():
    return (7, 2)

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

输出:

7
2
(7, 2)

我更喜欢显式元组语法(带括号的语法),因为我相信它会使意图更清晰。

答案 3 :(得分:0)

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

右侧的表达式返回两个值,这两个值分配给左侧的两个变量。

答案 4 :(得分: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)]

答案 5 :(得分: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]

答案 6 :(得分: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_list中包含*target,这将吞下可变数量的参数。