【问题标题】:Why single element tuple is interpreted as that element in python?为什么单个元素元组被解释为python中的那个元素?
【发布时间】:2016-11-20 23:00:10
【问题描述】:

谁能解释为什么单元素元组在 Python 中被解释为那个元素?

他们为什么不将元组 (1,) 打印为 (1)

请看下面的例子:

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

【问题讨论】:

  • 谁能解释一下为什么单元素元组被解释为 Python 中的那个元素? 不是。
  • 回到你的口译员那里,做这个x = (1),然后做type(x)

标签: python printf tuples convention


【解决方案1】:

这是因为(1) 不是元组。 (1)1,用括号括起来。正如python文档所述

定义元组的是逗号,而不是括号。

Source

唯一没有逗号的元组是 0 元组,即 ()。请注意,您可以通过运行 type((1)) 来检查这一点,并看到它返回 <type 'int'> 而不是 <type 'tuple'>

【讨论】:

    【解决方案2】:

    单个元素元组永远不会被视为包含的元素。括号主要用于分组,而不是创建元组;逗号就是这样做的。

    他们为什么不直接将 (1,) 打印为 (1)?

    可能是因为打印内置容器类型提供了一种可用于通过 重新创建容器对象的表示,例如eval

    __repr__ 的文档对此提供了一些说明:

    如果可能的话,这应该看起来像一个有效的 Python 表达式 可用于重新创建具有相同值的对象

    回答您的问题,(1) 只是带​​有分组括号的整数 1。为了通过其表示重新创建单例元组,它必须打印为(1,),这是创建元组的有效语法。

    >>> t = '(1,)'
    >>> i = '(1)'
    >>> eval(t)
    (1,) # tuple
    >>> eval(i)
    1    # int
    

    【讨论】:

    • 我认为这不过是一个公约。 通过其表示重新创建非常有用
    【解决方案3】:

    因为在您的示例中只有 (1, ) 是元组。其余的都是表达式。

    In [4]: type(1,)
    Out[4]: int
    
    In [5]: type((1,))
    Out[5]: tuple
    
    In [6]: type((1))
    Out[6]: int
    

    【讨论】:

      【解决方案4】:

      这是来自@Ray Total 的非常详细的answer

      当然,通常括号不会改变表达式的含义。例如,你可以说 4+(1) 它将是 5,同样的方式 4*(2-1) 将是 4。因为约定是使用括号来分组子表达式,Python 的设计者认为它会是太混乱了,无法重载含义以表示分组和单元素元组。 Python也有一个类型函数。事实上 type((2)) 是 int 而 type((2,)) 是元组。我们不希望有任何歧义,如果 (2) 被视为一个元组就会有这种歧义

      【讨论】:

        【解决方案5】:

        一个元组由多个用逗号分隔的值组成(不是必需的括号)。

        你甚至可以像这样定义元组

        t = 1,    # (with or without surrounding parentheses)
        
        >>> type(t)
        <class 'tuple'>
        

        这里, 用于告诉解释器创建元组,如果不存在,它将视为int

        当我们这样定义时,同样的规则适用

        >>> t = (1) 
        >>> type(t)
        <class 'int'>
        

        【讨论】:

          【解决方案6】:

          (1) 不是一个元组,它只是一个数字的括号。这是因为有时您想使用括号来表示操作顺序,例如:(x+y)*z。这显然不是指包含x+y 的元组,只是为了表明加法应该发生在乘法之前。

          (((1))) 不是一个元组出于同样的原因,括号只是说“在继续之前评估里面的内容”。

          print(1,) 只是在数字 1 上调用 print 函数。调用函数时,允许尾随逗号。但是,在 python2 中,这可能会触发(1,),因为print 不是函数。

          print((1,)) 是唯一打印元组的东西,因为我们现在实际上是在将一个元组传递给函数。

          【讨论】:

            猜你喜欢
            • 2018-02-13
            • 2012-11-22
            • 1970-01-01
            • 1970-01-01
            • 2018-09-10
            • 1970-01-01
            • 2019-01-14
            • 1970-01-01
            • 2018-05-04
            相关资源
            最近更新 更多