2

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

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

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

a, = [2,3]

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

任何见解将不胜感激。

4

3 回答 3

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)

失败,因为您需要左侧的项目数量与右侧的可迭代项包含的项目数量相同。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]
于 2013-02-27T03:44:24.027 回答
5

看看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(...)

plot 的返回值始终是一个列表,因为有时它需要返回多个 line 对象。甚至在列表中返回单行更有意义,这样客户端代码就不必以不同的方式处理每种情况。


解包a, = [2,3]失败的原因是右侧有 2 个要解包的东西,并且只有一个变量。你需要用它a,b = [2,3]来解压。

于 2013-02-27T03:51:01.617 回答
3

为了教育起见,我将把它写得有点长。

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

不幸的是,如果指定为 simple ,则仅由单个元素组成的元组 like1将是模棱两可的(从解析的角度来看)(1),因为这可能意味着表达式中间括号内的整数1。

为了克服这个问题,您可以指定一个只有一个元素的元组,该元素后跟一个逗号,如(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'>
于 2013-02-27T03:54:29.237 回答