60

我不明白变量后的逗号是什么意思: http: //matplotlib.org/examples/animation/simple_anim.html

line, = ax.plot(x, np.sin(x))

如果我删除逗号并且变量“line”变成变量“line”,那么程序就会被破坏。来自上面给出的 url 的完整代码:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
ax = fig.add_subplot(111)

x = np.arange(0, 2*np.pi, 0.01)        # x-array
line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x+i/10.0))  # update the data
    return line,

#Init only required for blitting to give a clean slate.
def init():
    line.set_ydata(np.ma.array(x, mask=True))
    return line,

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init,
    interval=25, blit=True)
plt.show()

根据http://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences,变量后的逗号似乎与仅包含一项的元组有关。

4

2 回答 2

76

ax.plot()返回一个包含一个元素的元组。通过将逗号添加到赋值目标列表中,您要求 Python 解包返回值并将其依次分配给左侧命名的每个变量。

大多数情况下,您会看到这被应用于具有多个返回值的函数:

base, ext = os.path.splitext(filename)

但是,左侧可以包含任意数量的元素,并且只要它是元组或变量列表,就会进行解包。

在 Python 中,逗号使某些东西成为元组:

>>> 1
1
>>> 1,
(1,)

在大多数位置,括号是可选的。您可以在不改变含义的情况下括号重写原始代码:

(line,) = ax.plot(x, np.sin(x))

或者您也可以使用列表语法:

[line] = ax.plot(x, np.sin(x))

或者,您可以将其重铸为使用元组解包的行:

line = ax.plot(x, np.sin(x))[0]

或者

lines = ax.plot(x, np.sin(x))

def animate(i):
    lines[0].set_ydata(np.sin(x+i/10.0))  # update the data
    return lines

#Init only required for blitting to give a clean slate.
def init():
    lines[0].set_ydata(np.ma.array(x, mask=True))
    return lines

有关分配如何与解包相关的完整详细信息,请参阅分配语句文档。

于 2013-04-16T12:49:39.093 回答
27

如果你有

x, = y

您解压缩长度为 1 的列表或元组。例如

x, = [1]

将导致x == 1,而

x = [1]

x == [1]

于 2013-04-16T12:52:02.287 回答