2015-08-21 43 views
5

前段时间我以为元组的构造函数是一对括号()为什么在元组中需要括号?

例子:

>>> (1,) 
(1,) 
>>> type((1,)) 
<type 'tuple'> 
>>> t = (1,) 
>>> type(t) 
<type 'tuple'> 

但现在我知道,这是逗号,

所以,做与上面相同:

>>> 1, 
(1,) 
>>> type(1,) 
<type 'int'> # Why? 
>>> 1,2,3 
(1,2,3) 

但是,如果我做的:

>>> type(1,2,3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: type() argument 1 must be string, not int 

这对我来说很有意义,但是:

>>> t = 1,2,3 
>>> type(t) 
<type 'tuple'> 

最后:

>>> type((1,2,3)) 
<type 'tuple'> 

下面是一个问题:如果元组只是1,2,3,为什么在最后一种情况下需要括号?

+2

类型(1,2,3)可能会混淆python,因为','用于分隔参数。所以它可能会认为1是第一个参数,2是第二个参数等等。 – NendoTaka

+1

https://stackoverflow.com/questions/16017811/when-are-parentheses-required-around-a-tuple – chishaku

+1

'type(())'怎么样?这返回'tuple'。 –

回答

1

因为有时没有括号,表达式会变得模糊不清:如果没有它们,您正在使用三个参数进行函数调用。由于某些函数需要三个参数,因此需要使用不同的表示来表示单个三元元组参数。碰巧,可以用一个或三个参数调用type()。在后一种情况下,第一个参数必须是一个类名,所以当它看到一个整数时会报错。

4

在某些情况下,逗号具有另一个含义 - 例如,在函数调用的括号内,它们将参数分开。在你的元组周围放置一组括号可以保证它在简单的表达式上下文中,其中逗号被解释为元组元素分隔符。

3

我要说的是t (1,2,3):

>>> t = 1,2,3 
>>> t 
(1, 2, 3) 
>>> type(t) 
<class 'tuple'> 

t = 1,2,3对于明确括号版本语法糖,糖的一种形式,是tuple-特别好拆包。

1

您用三个整数调用type,这与任何重载实现的预期参数都不匹配。

+0

这种情况是有道理的。 – Gocht

1

因为没有括号,type()内置函数将解释你给三个参数,而不是一个。

python official documentation,类型()可以接受一个或三个参数:

  • 类型(对象)
  • 类型(名称,碱,字典)

并与括号您提供只是一个参数,一个元组对象,它不会导致错误。

相关问题