,=运算符

Ili*_*ski 3 python operators python-2.7

在查看一些Python代码时,我注意到了看起来像,=运算符的用法:

a ,= b
Run Code Online (Sandbox Code Playgroud)

经过实验和对赋值语句语法的非常仔细的检查,我开始意识到它实际上是"元组解包",a,左侧是长度为1 的元组,b右侧是集合.所以在一个简单的例子中,它就像以下一样,但也适用于任何迭代/生成器:

assert len(b)
a = b[0]
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 7

没有这样的运算符,它是具有目标列表的轧机赋值语句的正常运行.大多数人会使用不同的间距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
Run Code Online (Sandbox Code Playgroud)

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

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

cursor.execute('SELECT id FROM TABLE WHERE condition LIMIT 1')
result_id, = cursor.fetchone()
Run Code Online (Sandbox Code Playgroud)

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

没有"不那么模糊"的技术形式,没有.一旦你知道它,你就不需要任何其他技术,也不再模糊不清!