,=运算符

时间:2015-11-29 13:37:28

标签: python python-2.7 operators

在查看一些Python代码时,我注意到使用了,=运算符:

a ,= b

在对assignment statements syntax进行实验和非常仔细的检查之后,我开始意识到它实际上已经解决了#34; tuple unpacking"左侧的长度为1的元组a,和右侧的集合b。所以在一个简单的例子中,它类似于以下内容,但也适用于任何迭代/生成器:

assert len(b)
a = b[0]

我很好奇这个技巧是否有名称,是否有不那么模糊的技术可以达到相同的效果?

2 个答案:

答案 0 :(得分:5)

没有这样的运算符,它是具有目标列表的工厂assignment statement的正常运行。大多数人会使用不同的间距a, = b

您正在查看元组分配(也称为解包),左侧可以有多个元素。请记住,正是逗号使表达式求值为元组,而不是括号。单目标表单没有更具体的名称。

左侧是一个元组,a,。然后解压缩右侧,并且必须包含一个元素,然后将其存储在a中。如果左侧有更多目标,则右侧必须具有匹配数量的元素:

>>> 1,  # a tuple with one element
(1,)
>>> a, = 1,  # assigning one value to the left-hand targets.
>>> a
1
>>> a, b = 1,  # not enough elements
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
>>> a, b = 1, 2, 3  # the syntax requires an exact match, 3 is too many
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> a, b = 1, 2   # two values assigned
>>> a
1
>>> b
2

分配给目标列表是赋值运算符的一个常规且广泛使用的特性,即使不是每个人都意识到这可以与单元素元组一起用作目标。

这种技术在处理API时常用,它始终总是生成元组或列表,但您只期望一个值。规范示例是数据库API:

cursor.execute('SELECT id FROM TABLE WHERE condition LIMIT 1')
result_id, = cursor.fetchone()

数据库查询结果的每一行始终都是一个序列,即使您只选择了一列。

没有更少的模糊&#39;技术的形式,没有。一旦你知道它,你就不需要任何其他技术,也不再模糊不清!

答案 1 :(得分:1)

陈述;

a, = b
  • 假设b是可迭代的
  • 从b获取第一个值并将其分配给(靠近a = b[0]
  • 断言b没有更多值(即len(b) == 1

从这个意义上讲,它与a = b[0]不同。后者适用于b = ['a', 'b'],而第一个会引发ValueError: too many values to unpack。另一方面:

l = [x]
it = iter(l)
a, = it    #fine when a=it[0] raises TypeError: 'listiterator' object has no attribute '__getitem__'

TL / DR:如果b是列表或具有单个元素的元组,则a, = ba = b[0]的行为相同,但在其他情况下可能表现不同