为什么在python中将单元素元组解释为该元素?

为什么在python中将单元素元组解释为该元素?,python,printf,tuples,convention,Python,Printf,Tuples,Convention,有人能解释一下为什么在Python中将单元素元组解释为那个元素吗 及 为什么他们不把元组打印成(1,)(1) 请参见以下示例: >>> (1) 1 >>> ((((1)))) 1 >>> print(1,) 1 >>> print((1,)) (1,) 因为在您的示例中只有(1,)是tuple。其余的都是表达 In [4]: type(1,) Out[4]: int In [5]: type((1,)) Out[5]:

有人能解释一下为什么在Python中将单元素元组解释为那个元素吗

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

请参见以下示例:

>>> (1)
1
>>> ((((1))))
1
>>> print(1,)
1
>>> print((1,))
(1,)
因为在您的示例中只有
(1,)
是tuple。其余的都是表达

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

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

In [6]: type((1))
Out[6]: int
这是因为
(1)
不是元组<代码>(1)是
1
,周围有括号。正如python文档所述

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

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

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

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

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

print(1,)
正在调用数字1上的print函数。调用函数时,允许使用尾随逗号。然而,在python2中,这可能会触发
(1,)
,因为
打印
不是一个函数

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

这在@Ray Total中非常详细

当然,在一般情况下,括号不会改变表达式的含义。例如,你可以说4+(1),它将是5,同样的方式4*(2-1)将是4。由于惯例是使用括号对子表达式进行分组,因此Python的设计者认为,如果将分组元组和单元素元组的含义都重载,那就太混乱了。Python还有一个类型函数。事实上,类型((2))是int,类型((2,))是tuple。我们不希望出现任何歧义,如果(2)被视为元组,就会出现这种歧义


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

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

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

的文档对此作了一些澄清:

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

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

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

有人能解释一下为什么单元素元组被解释为Python元素吗?不是。回到你的解释器,做这个
x=(1)
,然后做
type(x)
。我认为这只是一个惯例。通过其表示进行重新创建非常有用