2009-11-10 162 views
36

通过Peter Norvig的Solving Every Sudoku Puzzle essay阅读,我遇到了一些我以前从未见过的Python成语。Python赋值运算符使用逗号和下划线的含义?

我知道,一个函数可以返回值的元组/列表,在这种情况下,你可以指定多个变量的结果,如

def f(): 
    return 1,2 

a, b = f() 

但什么是每个的意思以下?

d2, = values[s] ## values[s] is a string and at this point len(values[s]) is 1 

如果len(values[s]) == 1,再怎么比d2 = values[s]不同的这种说法?

关于这里的分配使用下划线另一个问题:

_,s = min((len(values[s]), s) for s in squares if len(values[s]) > 1) 

是否有下划线的基本丢弃在列表中返回的第一个值的效果?

回答

33

d2, = values[s]就像a,b=f(),除了拆包1级元素的元组。

>>> T=(1,) 
>>> a=T 
>>> a 
(1,) 
>>> b,=T 
>>> b 
1 
>>> 

a是元组,b是整数。

+2

所以“B = T”的手段从那个元组的第一个元素?它是'b = T [0]'的同义词吗?我需要更多的例子或更少罗嗦的解释^^ – Sherlock70 2016-02-25 15:26:17

+2

是的,这是相同的结果 – eduffy 2016-02-25 15:31:49

15

_就像任何其他变量的名称,但通常意味着“我不关心这个变量”。

第二个问题:它是“价值拆包”。当一个函数返回一个元组时,你可以解开其元素。

>>> x=("v1", "v2") 
>>> a,b = x 
>>> print a,b 
v1 v2 
6

Python shell中的_还引用了上次操作的值。因此,

>>> 1 
1 
>>> _ 
1 

逗号指的是元组解包。会发生什么是返回值是一个元组,因此它按照元组元素的顺序被解压缩成由逗号分隔的变量。

+1

是的,但在上面给出的上下文中,它是一个“不关心”变量。 – 2009-11-10 21:36:46

5

您可以使用尾随逗号在这样一个元组:

>>> (2,)*2 
(2, 2) 

>>> (2)*2 
4