我正在查看我发现的一个有趣的示例脚本(在this site,最后一个示例第124行),我正在努力理解particles
之后的逗号在此行中实现的内容:
particles, = ax.plot([], [], 'bo', ms=6)
如果省略逗号,脚本将出现错误,但语法(似乎类似于解包语句)对我来说没有多大意义,并且语句如
a, = [2,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'>