2013-03-03 13 views
5

Perché i set e gli elenchi vuoti generano eccezioni diverse quando si chiama .pop()?Differenti eccezioni per il pop da set ed elenchi vuoti?

>>> l = [] 
>>> l.pop() 
Traceback (most recent call last): 
    File "<pyshell#15>", line 1, in <module> 
    l.pop() 
IndexError: pop from empty list 
>>> l = set() 
>>> l.pop() 
Traceback (most recent call last): 
    File "<pyshell#17>", line 1, in <module> 
    l.pop() 
KeyError: 'pop from an empty set' 

risposta

7

Perché sets sono un po 'come dict s, ma senza i valori:

>>> d = {} 
>>> d.pop('foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'pop(): dictionary is empty' 

Entrambi i dizionari ei set non vengono indicizzati, come le liste sono, quindi un IndexError non ha senso qui. Ma allo come nei dizionari, c'è sempre un solo valore per ogni 'chiave' nel set.

+0

Mi picchia in pochi secondi! – inspectorG4dget

+0

Ottenere un 'KeyError' quando la chiave fornita a' dict.pop ({chiave valore}) 'non esiste, indipendentemente dal fatto che il dizionario sia o meno vuoto, ha certamente senso, ma non tanto con' set.pop() 'che non accetta uno come argomento. La mia ipotesi è che sia compatibile con la classe 'Set' nel modulo [' sets'] (http://docs.python.org/2/library/sets.html) introdotto in Python 2.3 che è stato implementato usando i dizionari secondo la documentazione. – martineau

+0

@martineau: '.remove()' solleva anche un 'KeyError'. Secondo [questo commit] (http://hg.python.org/cpython/file/3086620db46b/Objects/setobject.c) è stato modellato dopo 'dict.pop()' * esplicitamente *. –

7

Le liste sono sequenze ordinate, accessibili per indice; gli insiemi sono non ordinati e non sequenziali, accessibili per chiave, quindi i messaggi di errore.