Python 运算符

Python 运算符,python,python-2.7,operators,Python,Python 2.7,Operators,在查看一些Python代码时,我注意到使用了类似于,=运算符的用法: a ,= b 经过实验和非常仔细的检查,我意识到它实际上是“元组解包”,元组a,长度为1,左侧为集合b。因此,在一个简单的情况下,它类似于以下内容,但也适用于任何iterables/生成器: assert len(b) a = b[0] 我很好奇这个技巧是否有一个名字,是否有任何不那么晦涩的技术可以达到同样的效果?没有这样的操作符,这是一个有目标列表的正常操作。大多数人会使用不同的间距,a,=b 您正在查看元组分配(也称为

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

a ,= b
经过实验和非常仔细的检查,我意识到它实际上是“元组解包”,元组
a,
长度为1,左侧为集合
b
。因此,在一个简单的情况下,它类似于以下内容,但也适用于任何iterables/生成器:

assert len(b)
a = b[0]

我很好奇这个技巧是否有一个名字,是否有任何不那么晦涩的技术可以达到同样的效果?

没有这样的操作符,这是一个有目标列表的正常操作。大多数人会使用不同的间距,
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
数据库查询结果的每一行始终是一个序列,即使您只选择了一列

并没有“不那个么晦涩”的技术形式,不。一旦你们知道了它,你们就不需要任何其他的技术,它也不再晦涩了

声明

a, = b
  • 假设b是可迭代的
  • 从b中获取第一个值并将其分配给a(靠近
    a=b[0]
  • 断言b没有更多的值(即
    len(b)==1
从这个意义上讲,它与
a=b[0]
不同。后者将处理
b=['a','b']
,而前者将引发
ValueError:太多的值无法解压缩。另一方面:

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]
的行为相同,但在其他情况下,它们的行为可能不同

我想你没有回答这个问题asked@PadraicCunningham:我给这项技术命名,试着解决困惑这是一个特殊的操作员(暗示这是正常的行为)。OP似乎知道元组解包,他们似乎想知道一种不那么晦涩的技术来做
a,=b
正在做的事情,而
a=b[0]
几乎就是这样做的is@PadraicCunningham:如果您也对长度进行了断言,则是。
a,=[]
会失败,就像
a=[[0]
一样,我认为第二个更容易阅读。我从来没有完全理解为什么选择逗号作为元组的方式。
a=b[0]
是一个不那么晦涩的方法technique@PadraicCunningham:如果没有
len(b)的注释,则是不完整的==1
但是。可能重复
l = [x]
it = iter(l)
a, = it    #fine when a=it[0] raises TypeError: 'listiterator' object has no attribute '__getitem__'