x, = ... - 这个尾随逗号是逗号运算符吗?

Posted

技术标签:

【中文标题】x, = ... - 这个尾随逗号是逗号运算符吗?【英文标题】:x, = ... - is this trailing comma the comma operator? 【发布时间】:2013-04-08 21:13:47 【问题描述】:

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

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

如果我删除逗号和变量“line”,变成变量“line”,那么程序就被破坏了。上面给出的网址的完整代码:

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变量后的逗号似乎与仅包含一项的元组有关。

【问题讨论】:

你的最后一行很中肯。它假设您已经知道的是,当您在可迭代对象之间进行分配时,元素是排列好的。所以x,y,z=1,2,3是一种Pythonic的写x=1;y=2;z=3的方式。 我无法在下面的答案中添加更多内容,但我想我会添加一个简洁的结果:逗号运算符还使 Python 能够在一条富有表现力的清晰行中切换变量值(看到这在 The Quick Python Book 中):x2,x1 = x1,x2. What does the comma in this assignment statement do?的可能重复 【参考方案1】:

ax.plot() 返回一个带有 one 元素的 tuple。通过将逗号添加到赋值目标列表中,您要求 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

有关解包的分配如何工作的完整详细信息,请参阅Assignment Statements 文档。

【讨论】:

是的。如果有帮助,你可以认为它相当于line = ax.plot(x, np.sin(x))[0] @Aya:除了line, = ...语法会在iterable中右侧有0个或多于1个元素时抛出异常,而使用索引只会在有0时抛出异常元素。 大约一年一次,我会分行并错过行尾的尾随逗号,例如x = 1,。然后我花了一段时间才终于意识到为什么元组出现在它们不应该出现的地方 请注意,plt.plot 允许其参数有多种方式。例如。 plot(x1, y1, 'g^', x2, y2, 'g-') 将返回一个包含两个 Line2D 元素的列表。为了保持一致性,当只有一个 Line2D 元素时,也会返回一个列表。【参考方案2】:

如果你有

x, = y

你解压一个长度为 1 的列表或元组。 例如

x, = [1]

将导致x == 1,而

x = [1]

x == [1]

【讨论】:

以上是关于x, = ... - 这个尾随逗号是逗号运算符吗?的主要内容,如果未能解决你的问题,请参考以下文章

数组和对象中的尾随逗号是规范的一部分吗?

您可以在 JSON 对象中使用尾随逗号吗?

我应该在函数调用中的最后一个参数后添加一个尾随逗号吗?

添加尾随逗号的键盘快捷键? (颤振和安卓工作室)

python字典自动添加尾随逗号

以逗号分隔的字符串查找目录列表,不带尾随逗号