【问题标题】:Mystical comma in a Python expression [duplicate]Python表达式中的神秘逗号[重复]
【发布时间】:2013-04-12 16:33:49
【问题描述】:

我想知道逗号在这段代码中的作用:

line, =

以下示例显示了该行为:

import numpy as np
import matplotlib.pyplot as plt


fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)
print("First:")
print(line)
print("Second:")
line = ax.plot([], [], lw=2)
print(line)

结果:

First:
Line2D(_line0)
Second:
[<matplotlib.lines.Line2D object at 0xb137c4c>]

当我尝试使用 line 变量时真的变得很混乱,我不知道是否使用尾随逗号:

def init():
    line.set_data([], [])
    return line,

或者有没有更好的方法来避免逗号?

【问题讨论】:

  • 这在你有一个包含单个项目的容器时很有用,而不是x = L[0],你可以只做x, = L

标签: python


【解决方案1】:

它只是解包一个 1 元组。例如:

line, = ('foo',)   # same as line = 'foo' in this example

比较

line1, line2 = ('foo', 'bar') # unpack a 2-tuple

等等

【讨论】:

  • 所以这意味着,稍后返回“line”会再次使它成为一个元组?
  • @DrJay 是的,尽管在这种情况下人们可能只写return (line,)
【解决方案2】:

对元组解包很有帮助

在此处查看不同的结果:

a = (1,)
print(a) # prints (1,)

a,  = (1,)
print(a) # prints 1

【讨论】:

    【解决方案3】:

    在 Python 中,有一个快捷方式可以一次分配多个变量:

    (a, b, c) = something
    

    您分配给变量元组而不是单个变量。如果something 不是恰好包含 3 个元素的集合,则此示例将引发异常;否则它将a 绑定到something 中的第一项,b 绑定到第二项,c 绑定到第三项。

    您可能知道,在 Python 元组中,括号通常是可选的;重要的是逗号。所以你也可以把我的例子写成:

    a, b, c = something
    

    这当然适用于任何大小的变量元组,而不仅仅是三个。并且 1 元组由一个带有尾逗号且后面没有1 的单个项目表示。所以你的例子:

    line, = ax.plot([], [], lw=2)
    

    只是断言ax.plot([], [], lw=2) 返回一个包含单个元素的集合,并将line 绑定到该元素。它与几乎相同的陈述不同:

    line = ax.plot([], [], lw=2)
    

    因为这会将line 绑定到集合本身,并且不包含关于它拥有的元素数量的断言。


    1 这有点难看,但很有必要,因为唯一其他明显的语法是(item),它会与简单地将子表达式括起来的语法相冲突。例如。没有人希望 2 * (3 + 1) 给出关于将 inttuple 相乘的错误。

    【讨论】:

      【解决方案4】:

      它使变量成为元组中的第一个(并且仅在这种情况下)项。这允许“多个”分配,例如:

      a, b = 1, 2
      

      这对于交换值特别有用,因此,从上面继续,您可以这样做:

      a, b = b, a
      

      ab 变量将交换值。

      【讨论】: