在查看一些Python代码时,我注意到使用了,=
运算符:
a ,= b
在对assignment statements syntax进行实验和非常仔细的检查之后,我开始意识到它实际上已经解决了#34; tuple unpacking"左侧的长度为1的元组a,
和右侧的集合b
。所以在一个简单的例子中,它类似于以下内容,但也适用于任何迭代/生成器:
assert len(b)
a = b[0]
我很好奇这个技巧是否有名称,是否有不那么模糊的技术可以达到相同的效果?
答案 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
a = b[0]
)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, = b
和a = b[0]
的行为相同,但在其他情况下可能表现不同