在Python中,只有一个元素的元组需要一个尾部的逗号

商业

图元,在Python中是不可变的(不可改变的)序列对象。

在生成只有一个元素的图元或空图元时必须小心。

这里介绍一下以下细节。

  • 有1个元素的元组
  • 元组圆括号可以省略。
  • 空元组
  • 函数参数中的图元

有1个元素的元组

如果你试图生成一个只有一个元素的元组,并在圆括号()内只写一个对象,圆括号()将被忽略和处理,不被视为一个元组。

single_tuple_error = (0)

print(single_tuple_error)
print(type(single_tuple_error))
# 0
# <class 'int'>

生成一个有一个元素的元组时,需要一个尾部的逗号。

single_tuple = (0, )

print(single_tuple)
print(type(single_tuple))
# (0,)
# <class 'tuple'>

例如,当使用+运算符串联多个图元时,请注意,如果你试图添加一个元素而忘记了逗号,你将得到一个错误。

# print((0, 1, 2) + (3))
# TypeError: can only concatenate tuple (not "int") to tuple

print((0, 1, 2) + (3, ))
# (0, 1, 2, 3)

元组圆括号可以省略。

有一个元素的元组之所以需要逗号,是因为元组不是用圆括号()括起来的值,而是用逗号分隔的值。

创建元组的是逗号,而不是圆括号。
Tuples — Built-in Types — Python 3.10.4 Documentation

即使省略了圆括号(),也会作为一个元组来处理。

t = 0, 1, 2

print(t)
print(type(t))
# (0, 1, 2)
# <class 'tuple'>

请注意,在一个对象后面的一个不必要的逗号被认为是一个元组。

t_ = 0,

print(t_)
print(type(t_))
# (0,)
# <class 'tuple'>

空元组

如上所述,在表示一个元组时,圆括号()可以省略,但在生成一个空元组时则需要。

单独的空格或逗号将导致一个语法错误。

empty_tuple = ()

print(empty_tuple)
print(type(empty_tuple))
# ()
# <class 'tuple'>

# empty_tuple_error = 
# SyntaxError: invalid syntax

# empty_tuple_error = ,
# SyntaxError: invalid syntax

# empty_tuple_error = (,)
# SyntaxError: invalid syntax

空图元也可以由不带参数的tuple()生成。

empty_tuple = tuple()

print(empty_tuple)
print(type(empty_tuple))
# ()
# <class 'tuple'>

函数参数中的图元

即使存在语法上的歧义,也需要有元组圆括号()。

函数参数由逗号分隔,但在这种情况下,有必要通过圆括号()的存在或不存在来明确表示函数是否为元组。

没有括号(),每个值被传递给每个参数;有括号(),每个值被作为一个元组传递给一个参数。

def example(a, b):
    print(a, type(a))
    print(b, type(b))

example(0, 1)
# 0 <class 'int'>
# 1 <class 'int'>

# example((0, 1))
# TypeError: example() missing 1 required positional argument: 'b'

example((0, 1), 2)
# (0, 1) <class 'tuple'>
# 2 <class 'int'>

如果元组被标记为星号*,则元组的元素可以被展开并作为参数传递。

example(*(0, 1))
# 0 <class 'int'>
# 1 <class 'int'>

欲了解更多信息,请参阅以下文章。

Copied title and URL