我正在查看我发现的一个有趣的示例脚本(在这个站点,最后一个示例行 124),我正在努力理解逗号之后particles
在这一行中实现的内容:
particles, = ax.plot([], [], 'bo', ms=6)
如果省略逗号,脚本将出错,但语法(似乎类似于解包语句)对我来说没有多大意义,并且像这样的语句
a, = [2,3]
失败,这似乎是反对拆包理论的论据。
任何见解将不胜感激。
我正在查看我发现的一个有趣的示例脚本(在这个站点,最后一个示例行 124),我正在努力理解逗号之后particles
在这一行中实现的内容:
particles, = ax.plot([], [], 'bo', ms=6)
如果省略逗号,脚本将出错,但语法(似乎类似于解包语句)对我来说没有多大意义,并且像这样的语句
a, = [2,3]
失败,这似乎是反对拆包理论的论据。
任何见解将不胜感激。
需要解包 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]
看看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]
来解压。
为了教育起见,我将把它写得有点长。
在 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'>