【问题标题】:Why is comma used while extending tuple by using asterisk in python? [duplicate]为什么在 python 中使用星号扩展元组时使用逗号? [复制]
【发布时间】:2019-07-14 09:58:07
【问题描述】:

在下面的代码中,如果我不使用逗号,那么只会打印一个 0,而如果我使用逗号 0,则会打印五次,为什么?这与元组的不可变特性有关吗?

 food = (0,) * 5  # comma used
 print (*food)

输出:0 0 0 0 0

 food = (0) * 5  # comma not used
 print (*food)

输出:0

【问题讨论】:

  • 后者怎么不给你TypeError
  • 因为后者被视为标量表达式。
  • scalar expression 那是什么?在第二个例子中food 是一个整数,你不能解包和整数,所以你会得到一个 TypeError
  • 第二个例子没有TypeError,你可以自己执行。这里的食物是一个变量,它被赋值为 0,因为括号内的 0 只不过是 0,0 乘以 5 得到 0,这是非常基本的。这个乘法部分是一个标量表达式。

标签: python tuples


【解决方案1】:

这是一个语法问题。定义元组的不是括号,而是逗号的存在:

  • 围绕单个标量表达式的括号用于定义评估顺序:(1 + 2) * 3
  • 用逗号分隔的表达式序列定义了一个元组:1, 2, 3
    • 如果该序列需要嵌入到其他表达式中,则可以用括号括起来:(1, 2, 3) * 5 是“重复五次的元组 (1,2,3)”。
  • 特别是对于单项元组,语法需要尾随逗号以将其与带括号的表达式区分开:0, 是仅包含元素 0 的元组;通常,如果您想将它嵌入到更大的表达式中,您会立即想用括号括起来,例如(0,) * 5(“由零组成的元组,乘以五”)。而0(0) 都表示“整数零”(以后一种形式括起来)。
>>> type( (0, ) )
tuple

>>> type ( (0) )
int

所以(0) * 5 是“整数 0 乘以 5”,得到 0。在任何时候都没有涉及元组,因为您使用的语法没有定义元组。

【讨论】:

  • @roganjosh 你是 100% 正确的,我的错。将编辑。
【解决方案2】:

因为:

>>> (0)
0
>>>

所以0 * 50,而:

>>> (0,)
(0,)
>>> 

保持它的元组类型。

【讨论】:

    【解决方案3】:

    Tuples and Sequences 在文档中,一个包含一个项目的元组是通过一个带有逗号的值来构造的

    一个特殊的问题是包含 0 或 1 项的元组的构造:语法有一些额外的怪癖来适应这些。 空元组由一对空括号构成;一个包含一个项目的元组是通过在一个值后面加上一个逗号来构造的(将单个值括在括号中是不够的)。 丑陋,但有效。例如

    >>> t=('hello')
    >>> t
    'hello'
    >>> type(t)
    <class 'str'>
    >>> t1=('hello',)
    >>> t1
    ('hello',)
    >>> type(t1)
    <class 'tuple'>
    >>>
    

    【讨论】:

      【解决方案4】:

      根据:[Python 3.Docs]: Built-in Types - class tuple([iterable])重点是我的):

      • 对单例元组使用尾随逗号a 或 (a,)

      food 定义(请注意,如果没有括号,则相同):

      • 在第一种st 的情况下,它是一个元组(因为(0,) 是一个元组)
      • 在第 2nd 情况下,它是一个普通的 int (0 * 5)
      >>> v0 = (0,)
      >>> v1 = (0)
      >>>
      >>> v0, type(v0)
      ((0,), <class 'tuple'>)
      >>> v1, type(v1)
      (0, <class 'int'>)
      >>>
      >>> v0 * 5
      (0, 0, 0, 0, 0)
      >>> v1 * 5
      0
      

      您确定print(*food) 在第 2nd 案例中有效(正如您声称的那样)

      【讨论】:

        猜你喜欢
        • 2011-07-01
        • 2019-03-19
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多