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'>

빈 튜플

위에서 언급했듯이 둥근 괄호()는 튜플을 나타낼 때 생략할 수 있지만 빈 튜플을 생성할 때는 필요합니다.

공백이나 쉼표만 있으면 SyntaxError가 발생합니다.

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'>

자세한 내용은 다음 문서를 참조하세요.