图元,在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'>
欲了解更多信息,请参阅以下文章。