Considerare la seguente funzione.
def f(x):
x += n
return x * 4
Qui x
è un nome locale, il suo valore può cambiare. 4
è una costante. Il suo valore non cambierà mai. Tuttavia, è ancora un oggetto ed è meglio memorizzarli nella cache piuttosto che creare un nuovo oggetto ogni volta che è necessario. Infine, n
è un riferimento globale. La stringa "n"
viene memorizzata dalla funzione in modo che possa essere utilizzata come chiave per recuperare n
dal contesto globale della funzione.
>>> f.__code__.co_nlocals # just 1 (for x)
1
>>> f.__code__.co_consts
(None, 4)
>>> f.__code__.co_names
('n',)
>>> "n" in f.__globals__ and globals() is f.__globals__
True
La ragione per mantenere i nomi e const separata è a fini di introspezione. L'unica vera ragione per unire le tuple sarebbe l'efficienza della memoria, anche se questo ti permetterebbe di ottenere solo un oggetto e un puntatore per ogni funzione. Considera la seguente funzione.
def g():
return "s" * n
Se la tupla contenente const è stato fuso con i nomi tupla contenente allora (non il VM) non sarebbe in grado di dire che i valori sono stati per globali di accesso e quali erano le costanti della funzione.
Solo per verificare, stai parlando di cpython corretto? Quale versione? –
@GamesBrainiac: 'co_names' è usato in cpython sia in 2 che in 3 e in pypy. Non sono sicuro di altre implementazioni perché non le uso. – 6502
Non ricordo molto bene, ma sono abbastanza sicuro che abbia qualcosa a che fare con il decapaggio. –