Le tuple con un solo elemento in Python richiedono una virgola finale

Attività commerciale

Tuple, che sono oggetti sequenza immutabili in Python.

Bisogna fare attenzione quando si generano tuple con un solo elemento o tuple vuote.

I seguenti dettagli sono descritti qui.

  • Tupla con 1 elemento
  • Le parentesi tonde della tupla possono essere omesse.
  • Tupla vuota
  • Tuple negli argomenti delle funzioni

Tupla con 1 elemento

Se cercate di generare una tupla con un elemento e scrivete solo un oggetto all'interno delle parentesi tonde (), le parentesi tonde () saranno ignorate e processate e non considerate una tupla.

single_tuple_error = (0)

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

Una virgola finale è necessaria per generare una tupla con un elemento.

single_tuple = (0, )

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

Per esempio, quando si usa l'operatore + per concatenare più tuple, si noti che se si cerca di aggiungere un elemento e si dimentica una virgola, si otterrà un errore.

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

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

Le parentesi tonde della tupla possono essere omesse.

La ragione per cui una tupla con un elemento ha bisogno di una virgola è perché una tupla non è un valore racchiuso tra parentesi tonde () ma un valore separato da una virgola.

È la virgola che crea la tupla, non le parentesi tonde.
Tuples — Built-in Types — Python 3.10.4 Documentation

Anche se le parentesi tonde () sono omesse, viene elaborato come una tupla.

t = 0, 1, 2

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

Notate che una virgola non necessaria dopo un oggetto è considerata una tupla.

t_ = 0,

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

Tupla vuota

Come detto sopra, le parentesi tonde () possono essere omesse quando si rappresenta una tupla, ma sono necessarie quando si genera una tupla vuota.

Uno spazio o una virgola da soli risulteranno in un 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

Le tuple vuote possono anche essere generate da tuple() senza argomenti.

empty_tuple = tuple()

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

Tuple negli argomenti delle funzioni

Le parentesi tonde () sono necessarie anche quando c'è un'ambiguità sintattica.

Gli argomenti delle funzioni sono separati da virgole, ma in questo caso, è necessario indicare esplicitamente se la funzione è una tupla o no con la presenza o l'assenza di parentesi tonde ().

Senza parentesi (), ogni valore viene passato ad ogni argomento; con le parentesi (), ogni valore viene passato come tupla ad un argomento.

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

Se la tupla è contrassegnata da un asterisco *, gli elementi della tupla possono essere espansi e passati come argomenti.

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

Per ulteriori informazioni, vedere il seguente articolo.