为什么单个元素元组被解释为python中的那个元素?

时间:2016-11-20 23:00:11

标签: python printf tuples convention

有人能解释为什么单个元素元组被解释为Python中的那个元素吗?

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

请参阅以下示例:

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

6 个答案:

答案 0 :(得分:3)

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

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

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

In [6]: type((1))
Out[6]: int

答案 1 :(得分:2)

这是因为(1)不是元组。 (1)1,其周围有括号。正如python文档所述

  

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

Source

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

答案 2 :(得分:1)

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

  

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

可能是因为打印内置容器类型提供了一个表示,可以用来重新创建容器对象,比如eval

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

  

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

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

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

答案 3 :(得分:1)

一个元组由多个以逗号分隔的值(不需要括号)组成。

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

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

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

同样的规则适用于我们这样定义

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

答案 4 :(得分:0)

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

由于同样的原因,

(((1)))不是一个元组,括号只是说“在继续之前评估内部的内容”。

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

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

答案 5 :(得分:0)

@Ray Total

中非常详细answer
  

当然,一般来说,括号不会改变表达式的含义。例如,你可以说4+(1),它将是5,就像4 *(2-1)将是4一样。因为惯例是使用括号分组子表达式,Python的设计者认为它将是过于混淆意味着意味着分组和单元素元组。 Python也有一个类型函数。实际上,type((2))是int而type((2,))是元组。我们不希望有任何含糊不清的情况,如果(2)被视为元组