C'est parce que bool
est une sous-classe de int
dans Python 2 et 3.
>>> issubclass(bool, int)
True
Mais le int
a changé.
Dans Python 2, int
était celle qui comportait 32 ou 64 bits, selon le système, par opposition à une longueur arbitraire. long
.
Dans Python 3, int
est de longueur arbitraire - le long
de Python 2 a été renommé en int
et la version originale de Python 2 int
a été abandonné.
En Python 2, vous obtenez exactement le même comportement pour long objets 1L
y 0L
:
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getsizeof(1L)
28
>>> sys.getsizeof(0L)
24
El long
/Python 3 int
est un objet de longueur variable, tout comme un tuple - lorsqu'il est alloué, suffisamment de mémoire est allouée pour contenir tous les chiffres binaires nécessaires pour le représenter. La longueur de la partie variable est stockée dans l'en-tête de l'objet. 0
ne requiert aucun chiffre binaire (sa longueur variable est de 0), mais même 1
déborde, et nécessite des chiffres supplémentaires.
I.e. 0
est représenté par une chaîne binaire de longueur 0 :
<>
et 1 est représenté par une chaîne binaire de 30 bits :
<000000000000000000000000000001>
La configuration par défaut dans Python utilise 30 bits dans un uint32_t
; so 2**30 - 1
tient toujours dans 28 octets sur x86-64, et 2**30
nécessitera 32 ;
2**30 - 1
sera présenté comme
<111111111111111111111111111111>
c'est-à-dire les 30 bits de valeur mis à 1 ; 2**30 aura besoin de plus, et il aura une représentation interne
<000000000000000000000000000001000000000000000000000000000000>
Quant à True
en utilisant 28 octets au lieu de 24 - vous ne devez pas vous inquiéter. True
est un singleton et donc seulement 4 octets sont perdus dans total dans tout programme Python, et non 4 pour chaque utilisation de True
.
3 votes
Related le même comportement apparaît pour
0
vs1
0 votes
Notez que l'évaluation de la consommation de mémoire à l'aide de
sys.getsizeof
y__sizeof__
(le dernier manque l'overhead GC) conduira à des résultats trompeurs à moins de vraiment, vraiment comprendre l'interpréteur Python. PyPy le considère comme un erreur pour utiliser l'un d'entre eux. Par exemple, les entiers 5 <= i <= 256 sont des singletons dans CPython -[1, 1]
y[1, 1, 1, 1]
ne diffèrent que par deux pointeurs supplémentaires en taille. Dans votre cas, vous devez déterminer siTrue
y1
partagent la même mémoire pour leur valeur.