这个赋值语句中的逗号有什么作用?

时间:2013-02-27 03:43:42

标签: python matplotlib

我正在查看我发现的一个有趣的示例脚本(在this site,最后一个示例第124行),我正在努力理解particles之后的逗号在此行中实现的内容:

particles, = ax.plot([], [], 'bo', ms=6)

如果省略逗号,脚本将出现错误,但语法(似乎类似于解包语句)对我来说没有多大意义,并且语句如

a, = [2,3]

失败,这似乎是反对解包理论的论据。

非常感谢任何见解。

3 个答案:

答案 0 :(得分:7)

需要解包1元组(或任何其他长度为1的序列)。例如:

>>> a,b = (1,2)
>>> print a
1
>>> print b
2
>>> c, = (3,)
>>> print c
3
>>> d = (4,)
>>> print d
(4,)

注意c和d之间的区别。

请注意:

a, = (1,2)

失败,因为左侧需要与右侧的iterable包含相同数量的项目。 Python 3.x有所缓解:

Python 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:09:56) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a,*rest = (1,2,3)
>>> a
1
>>> rest
[2, 3]

答案 1 :(得分:4)

查看plot调用返回的内容。在您的情况下,它是一个包含一个元素的列表:

>>> import matplotlib.pyplot as plt
>>> ax = plt.gca()
>>> ax.plot([], [], 'bo', ms=6)
[<matplotlib.lines.Line2D object at 0x353d6d0>]

现在在这种情况下更有用的是在实际的Line2D对象上使用一个句柄,使用h, = ax.plot(...)解压缩而不是像它一样的虚假容器

h = ax.plot([], [], 'bo', ms=6)

后者需要您稍后再进行额外的步骤,例如

h[0].set_data(...)

绘图的返回值始终是一个列表,因为有时它需要返回多个行对象。在列表中返回甚至单行更有意义,因此客户端代码不必以不同的方式处理每个案例。


解压缩a, = [2,3]失败的原因是在右侧解包有两件事,而且只有一个变量。您需要使用a,b = [2,3]来解压缩它。

答案 2 :(得分:2)

为了受教育,我会把它做多久。

在Python中,元组用括号分隔,例如:(1, 2, 3)

不幸的是,如果只指定为1,那么由(1)这样的单个元素组成的元组将是不明确的(从解析的角度来看),因为这可能意味着整数< / em>表达式中间的括号内的一个。

要解决这个问题,您可以使用一个元素指定一个元组,其元素后跟一个逗号,如(1,)中所示。 (只是为了说清楚,逗号是什么使它成为一个元组,而不是括号,当事情不明确时我们可以省略,这就是我在下面所做的)。这明确地是包含唯一单1元素的元组,如以下示例所示:

>>> a = (1)
>>> a
1
>>> b = (1,)
>>> b
(1,)
>>> b[0]
1
>>> c, = b
>>> c
1
>>>

你提到的是一种“解包”元组的方法,即访问元组的特定元素。您使用的语法的一种替代方法是将元组中的元素索引为0,就像上面示例中的b[0]一样。

对于具有多个元素的元组,只需指定与元组具有相同数量元素的属性,即可解压缩它们:

>>> x, y = (1, 2)
>>> x
1
>>> y
2

如果在解包元组时没有使用相同数量的元素,则会抛出异常:

>>> z, = (1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> 

在你解压缩理论“失败”原因的“例子”中,你可以简单地使用:

>>> a, _ = [2, 3]
>>> a
2

注意那里的_,这是Python中常用的变量,意思是“我们不在乎”。

作为附录,请注意在a, _ = [2,3]中,您隐式地从列表创建元组,这是一种不可变类型,这是一个可变类型。 (请注意,这种“隐式”转换是概念性的,因为Python解释器可能不会在字节码中生成BUILD_TUPLE指令。请注意以下属性的细微之处:

>>> a, b = [2, 3]
>>> a
2
>>> b
3
>>> a, b
(2, 3)
>>> c, d = tuple([2, 3])
>>> c
2
>>> d
3
>>> e = [2, 3]
>>> type(e)
<type 'list'>
>>> type((a, b))
<type 'tuple'>