python - ,= 运算符

标签 python python-2.7 operators

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

a ,= b

经过实验和非常仔细的检查 assignment statements syntax ,我开始意识到它实际上是“元组拆包”,左边是长度为1的元组a,,右边是集合b。所以在一个简单的例子中,它就像下面这样,但也适用于任何迭代器/生成器:

assert len(b)
a = b[0]

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

最佳答案

没有这样的运营商,这是工厂的正常运行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()

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

没有“不太晦涩”的技术形式,没有。知道了就不需要其他的技术了,也不再晦涩难懂!

关于python - ,= 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33983408/

相关文章:

python - 在列表中查找非唯一元素不起作用

python-2.7 - 如何使用棉花糖在sqlalchemy中序列化枚举属性

c++ - 为什么 ->[] 在 C++ 中不是运算符? (取消引用数组指针的下标运算符)

python - pandas.Grouper() 返回我的数据之外的分组日期标签

python - Tkinter:如何限制用户使用多种功能

具有无法预定义的替代长度的 Python (NumPy) 数组

php - 不等于 != 和 !== 在 PHP

python - key 没有发挥应有的作用

python - 将离线文档链接到 IDLE - Linux

python - 如何对 python 说 (a+b) = (b+a) 和 (a*b) = (b*a)