2015-03-15 6 views
8

ho notato per caso che l'aggiunta di una virgola separatore di extra alla fine di un elenco, dict o impostare è sintatticamente corretto e non sembra aggiungere nulla alla struttura dei dati:la virgola in più alla fine di un dett, elenco o set ha un significato speciale?

In [1]: d1 = {'a': 1, 'b': 2} 

In [2]: d2 = {'c': 10, 'd': 20,} 

In [3]: d1 
Out[3]: {'a': 1, 'b': 2} 

In [4]: d2 
Out[4]: {'c': 10, 'd': 20} 

Ha qualche significato speciale o utilizzo? L'unico che ho trovato è quello di esplicita una struttura di dati nel corso di una di inizializzazione:

In [14]: r = (1) 

In [15]: r 
Out[15]: 1 

In [16]: r = (1,) 

In [17]: r 
Out[17]: (1,) 
+3

In elenchi, set e dizionari, è totalmente opzionale. In tuple, è richiesto per una tupla singola, ma altrimenti facoltativa. – jonrsharpe

risposta

16

Non ha un significato speciale in una lista o un dizionario, ma può essere utile quando si utilizza codice sorgente strumenti di gestione del cambiamento, vedi sotto.

Le tuple non vuote vengono definite utilizzando una virgola tra gli elementi, le parentesi sono facoltative e richieste solo in contesti in cui la virgola potrebbe avere un significato diverso.

Poiché la virgola definisce tupla, è necessario almeno una virgola se c'è solo un elemento:

>>> 1 
1 
>>> 1, 
(1,) 
>>> type((1,)) # need parens to distinguish comma from the argument separator 
<type 'tuple'> 

La tupla vuota viene definito utilizzando parentesi vuote:

>>> type(()) 
<type 'tuple'> 

L' la virgola finale può essere utile per ridurre al minimo quante linee sono cambiate quando si aggiungono nuove linee; l'aggiunta di una linea aggiuntiva a un dizionario con una virgola finale non cambierebbe l'ultima voce esistente:

a_value = { 
    key1: value1, 
    key2: value2, 
    # inserting here doesn't require adding a comma 
    # to the preceding line. 
} 
5

E 'utile per la coerenza su più linee:

d1 = { 
    'a': 1, 
    'b': 2, 
} 

È possibile riordinare o aggiungere linee senza cambiare le virgole . Non cambia nulla delle informazioni rappresentate.

2

È possibile utilizzare il modulo dis per verificare che il comportamento di entrambi gli oggetti sia esattamente lo stesso.

In [10]: import dis 

In [11]: def make_dict(): 
    return {"a": 1, "b": 2} 
    ....: 

In [12]: def make_dict_2(): 
    return {"a": 1, "b": 2,} 
    ....: 

In [13]: dis.dis(make_dict) 
    2   0 BUILD_MAP    2 
       3 LOAD_CONST    1 (1) 
       6 LOAD_CONST    2 ('a') 
       9 STORE_MAP   
      10 LOAD_CONST    3 (2) 
      13 LOAD_CONST    4 ('b') 
      16 STORE_MAP   
      17 RETURN_VALUE   

In [14]: dis.dis(make_dict_2) 
    2   0 BUILD_MAP    2 
       3 LOAD_CONST    1 (1) 
       6 LOAD_CONST    2 ('a') 
       9 STORE_MAP   
      10 LOAD_CONST    3 (2) 
      13 LOAD_CONST    4 ('b') 
      16 STORE_MAP   
      17 RETURN_VALUE