Lorsque je tape de petits entiers avec un 0 devant en python, ils donnent des résultats étranges. Pourquoi est-ce?
>>> 011
9
>>> 0100
64
>>> 027
23
Remarque: Python version 2.7.3 Je l’ai testé dans Python 3.0 et, apparemment, il s’agit maintenant d’une erreur. C'est donc quelque chose de spécifique à la version.
Edit: ce sont apparemment encore des entiers:
>>> type(027)
`<type 'int'>`
Ce sont des nombres représentés en base 8 (nombres octaux) . Par exemple,
011
est égal à 1*(8**1) + 1*(8**0)
= 9,
0100
est égal à 1*(8**2) + 0*(8**1) + 0*(8**0)
= 64,
027
est égal à 2*(8**1) + 7*(8**0)
= 16 + 7 = 23.
En Python 2 (et quelques autres langages de programmation), ceux-ci représentent nombres octaux .
En Python 3, 011
ne fonctionne plus et vous utiliseriez plutôt 0o11
.
En réponse à edit: et ce sont des entiers normaux. Ils sont juste spécifiés de manière différente; et ils sont automatiquement convertis par Python en une représentation entière interne (qui est en réalité de base 2, donc 9
et 011
sont convertis en interne en 0b1001
).
Nombres en système numérique octal. Les autres préfixes sont 0x
pour hexadécimal et 0b
pour binaire.
Ce sont des nombres octaux (base 8, valeurs 0 - 7)
Vous pouvez convertir un nombre décimal en octal avec la fonction oct () .
In [125]: for i in range(10):
.....: print '{:5} {:5}'.format(i, oct(i))
.....:
0 0
1 01
2 02
3 03
4 04
5 05
6 06
7 07
8 010
9 011
et convertir une valeur octale en entier avec la fonction int () avec la base appropriée (8 dans ce cas):
int(str(17), 8)
Out[129]: 15
Le même ensemble de règles/fonctions s’applique aux nombres hexadécimaux (base 16) avec la fonction hex () .
C'est très facile. Ce sont des nombres octaux.
http://en.wikipedia.org/wiki/Octal
Il y a aussi des nombres qui commencent par 0x
. Ce sont des nombres hexadécimaux:
>>> 0x51
81
Ce sont apparemment des nombres octaux (base 8), et le 0 est simplement un préfixe obsolète utilisé par Python 2.
En Python 3, vous devez écrire: 0o11
à la place.
Ce sont toujours des entiers, mais les opérations effectuées avec eux donneront un résultat sous forme régulière en base 10.
Je l'ai essayé. J'ai appris un peu. De Java, je sais que cela est un piège: un zéro non significatif introduit un nombre octal. J'ai des collègues qui n'ont pas resp. Je ne le sais pas après plus d’années d’expérience en Java.
À présent, le comportement de Python était intéressant. J'apprécie ce changement de Python 2 à Python 3. C'est un écueil, je n'ai jamais compris pourquoi Java (un jeune langage centré sur "être facile") pourrait reprendre cette stupide solution de C.
Un zéro comme préfixe peut être saisi accidentellement (mauvaise solution). 0x pour un nombre hexadécimal n'est jamais saisi accidentellement (bonne solution). Mais 0 et o sont similaires, donc je pense que 0o23 en Python n'est pas une solution parfaite. 0c23 (o c tal) serait à mon avis une meilleure solution.
La dernière spécification Python pour les littéraux numériques se trouve dans PEP-3127 "Support et syntaxe de littéraux entiers"
La syntaxe pour 011 a été supprimée dans Python 3.0. La syntaxe de 0o11 a été ajoutée à Python 2.6 et est la seule prise en charge après Python 3.0. Il n'y a pas d'importation __future__
dans Python 2 qui interdirait ou au moins mettrait en garde sur les littéraux numériques précédés de zéros, les développeurs doivent donc savoir ce que 011 signifie et qu'il convient de l'éviter (et que cela peut réellement être évité).